编程题:实现对一颗二叉树的所有左右子节点位置交换
创作时间:
作者:
@小白创作中心
编程题:实现对一颗二叉树的所有左右子节点位置交换
引用
CSDN
1.
https://blog.csdn.net/zhu134/article/details/138508403
改变前的二叉树:
改变后的二叉树:
实际上就是镜像反转
代码实现
#include<iostream>
#include<stack>
using namespace std;
// 定义二叉树节点结构体
typedef struct BTNode{
char show; // 节点的数据
struct BTNode* left; // 左孩子节点指针
struct BTNode* right; // 右孩子节点指针
} BTNode;
// 定义二叉树结构体
typedef struct{
BTNode* root; // 根节点指针
int count; // 节点个数
} BinaryTree;
// 非递归中序遍历二叉树,用于检查交换结果
void inorderTraversal(BTNode* root) {
stack<BTNode*> s;
BTNode* current = root;
while (current || !s.empty()) {
while (current) {
s.push(current);
current = current->left;
}
current = s.top();
s.pop();
cout << current->show << " ";
current = current->right;
}
}
// 交换二叉树所有节点的左右子节点的位置
void swapChildren(BinaryTree* tree) {
stack<BTNode*> s;
s.push(tree->root);
while (!s.empty()) {
BTNode* current = s.top();
s.pop();
// 交换左右子节点
BTNode* temp = current->left;
current->left = current->right;
current->right = temp;
// 将左右子节点入栈
if (current->left) s.push(current->left);
if (current->right) s.push(current->right);
}
}
// 创建节点
BTNode* createBTNode(char show){
BTNode* node = new BTNode;
node->show = show;
node->left = nullptr;
node->right = nullptr;
return node;
}
// 初始化树根节点
void initBTreeRoot(BinaryTree* tree, BTNode* node){
tree->count = 1;
tree->root = node;
}
// 创建树
BinaryTree* createBTree(BTNode* root){
BinaryTree* tree = new BinaryTree;
if(root){ // 非空树
initBTreeRoot(tree, root);
} else{ // 空树
tree->root = NULL;
tree->count = 0;
}
return tree;
}
// 插入节点
// 在树中插入newNode节点,该节点的双亲节点为parent
// flag==1则该节点为左孩子,flag==0则该节点为右孩子
void insertBTNode(BinaryTree* tree, BTNode* parent, BTNode* newNode, int flag){
if(flag == 1){
parent->left = newNode;
} else{
parent->right = newNode;
}
tree->count++;
}
// 初始化一棵具体的树
// 创建并初始化一棵具体的二叉树,返回根节点指针
BinaryTree* initBTree(){
// 初始化节点
BTNode* a = createBTNode('A');
BTNode* b = createBTNode('B');
BTNode* c = createBTNode('C');
BTNode* d = createBTNode('D');
BTNode* e = createBTNode('E');
BTNode* f = createBTNode('F');
BTNode* g = createBTNode('G');
BTNode* h = createBTNode('H');
BTNode* i = createBTNode('I');
// 初始化树根
BinaryTree* tree = createBTree(a);
// 插入
insertBTNode(tree, a, b, 1);
insertBTNode(tree, a, e, 0);
insertBTNode(tree, b, c, 0);
insertBTNode(tree, c, d, 1);
insertBTNode(tree, e, f, 0);
insertBTNode(tree, f, g, 1);
insertBTNode(tree, g, h, 1);
insertBTNode(tree, g, i, 0);
return tree; // 返回树根节点
}
int main(){
// 初始化一棵具体的二叉树
BinaryTree* tree = initBTree();
// 输出交换前的二叉树中序遍历结果
cout << "交换前的二叉树中序遍历结果:" << endl;
inorderTraversal(tree->root);
cout << endl;
// 交换二叉树所有节点的左右子节点的位置
swapChildren(tree);
// 输出交换后的二叉树中序遍历结果
cout << "交换后的二叉树中序遍历结果:" << endl;
inorderTraversal(tree->root);
cout << endl;
// 释放内存
delete tree;
return 0;
}
输出结果:
热门推荐
掌握显著性检验,提升数据分析能力的关键技巧
春天这样穿太温柔了,修饰身材还显瘦,女人味十足!
剖腹产后怎样防止疤痕增生
印加帝国的陷落:内因与外来势力的交织
丙泊酚 vs 七氟醚:哪种麻醉药更利于减轻小儿术后疼痛?
国考各题型分数占比是多少
设备运营维护工作内容有哪些
自行车头盔尺寸选购指南:买大了怎么办?
德谷胰岛素和门冬胰岛素的区别
项目部关系户如何管理
班姓的起源:鲁班后代的传承与荣耀
班超:投笔从戎,收复西域的定远侯
上海街头有“亲子共享单车”亮相?注意!骑车带人得符合这些条件
共享单车乱停乱放咋办?多方合力共治共管是关键
2025高考体检时间表!附各省体检收费标准
《哪吒2》吸“影”力:点亮贵州影视“高光”,乘势联动影旅
Micro USB是什么?Micro USB和普通USB有什么区别?
6种低钠食物及其对心脏健康的益处
呕吐毒素检测:在饲料、啤酒加工行业中的关键应用
喝白酒好还是啤酒好?从健康到饮用场景的全面解析
上火喉咙痛?医生教你这样降火最快
心跳越快“走”得越早?这样的心率或导致死亡风险增加
如何利用哑铃健身呢?
烂番茄影评人评选的25部最佳电影,华语电影有1部上榜!
医患双重身份“与癌共舞”
网络不畅?快来对照这四项,看你是否达标!
苟姓名人大全:从三国谋士到北宋文人
山东垦利苟氏家族:基因与族谱交织的家族史
《静夜思》课件(完整)
喉咙结石是怎么形成的,该如何去掉