编程题:实现对一颗二叉树的所有左右子节点位置交换
创作时间:
作者:
@小白创作中心
编程题:实现对一颗二叉树的所有左右子节点位置交换
引用
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;
}
输出结果:
热门推荐
为什么要给孩子定期检查视力?重点关注哪些问题?
火针治富贵包,真能“一扎见效”?
针灸治富贵包,你试过吗?
速看!2024驾考新规,科目三“模拟灯光”攻略!
嘉峪关至新疆自驾游完整攻略:路线规划、景点推荐与实用指南
第一次去新疆旅游必知十大旅行注意事项!
Nature子刊热议:CGM与AI双轮驱动糖尿病管理新突破
糖尿病患者的心路历程:从绝望到希望
糖尿病患者血糖监测指南
二甲双胍:从降糖药到多疾病治疗的潜力药物
快走降压,高血压患者的福音!
心理调节:高血压治疗的重要一环
其他有限责任公司与股份有限公司的区别
“221健康刷牙法”教你科学刷牙
牙齿是脑梗的“放大镜”?医生:若牙齿出现这2种异常,及时就医
减重5%-15%,糖尿病患者如何做到?
糖尿病患者如何避免低血糖陷阱?
清炖鸡肉:健康美味的烹饪指南
电饭煲鸡vs砂锅鸡:谁才是家常菜之王?
国泰君安与海通证券合并!打造证券业"超级航母"
上海市一院远程管理,社区糖尿病低血糖不再难
肾癌切除2年还用吃中药吗,是否有必要?
合伙企业与有限责任公司有什么区别
基于多模态语篇的初中英语主题式群文阅读复习教学
世界气象日:气候行动最前线,中国贡献全球气候治理
中国气象局引领2024世界气象日活动:气候行动最前线
世界气象日:气候行动最前线,中国在行动
道教与佛教的跪拜礼仪大不同
跪拜礼仪在现代社会:传统与争议
三跪九叩:从礼仪演变到文化象征