递归创建二叉树的方法:
#include<iostream>
using namespace std;
struct BiNode{
char data;
BiNode *lchild, *rchild;
};
void CreateBinaryTree(BiNode **T) {
char ch;
cin >> ch;
//递归的终止条件,如果输入#号创建空指针,说明当前节点左子树已创建完毕
if (ch == '#')
*T = NULL;
else {
*T = (BiNode *)malloc(sizeof(BiNode));
(*T)->data = ch;
//左子树创建完成之后,才会去创建右子树,而不是左右子树同时创建
CreateBinaryTree(&((*T)->lchild));
CreateBinaryTree(&((*T)->rchild));
}
}
//前序遍历
void PreOrderTraversal(BiNode * BT) {
if (BT) {
cout << BT->data << " ";
//左子树遍历完成之后才会继续往下走
PreOrderTraversal(BT->lchild);
//这一步和上一步不是并列关系,必须等上一步执行完,才会往下走
//当然,既然是递归,在左子树遍历的时候,在那里面又会遍历左子树节点的右子树
PreOrderTraversal(BT->rchild);
}
}
//中序遍历
void InOrderTraversal(BiNode *BT) {
if (BT) {
InOrderTraversal(BT->lchild);
cout << BT->data << " ";
InOrderTraversal(BT->rchild);
}
}
//后序遍历
void PostOrderTraversal(BiNode *BT) {
if (BT) {
PostOrderTraversal(BT->lchild);
PostOrderTraversal(BT->rchild);
cout << BT->data << " ";
}
}
int main()
{
BiNode *root;
//root本身是指针,再取地址就是二级指针
CreateBinaryTree(&root);
//访问二叉树,不需要改变它什么,直接传root进去即可。
PreOrderTraversal(root);
cout << endl;
InOrderTraversal(root);
cout << endl;
PostOrderTraversal(root);
cout << endl;
system("pause");
return 0;
}
测试数据:
ABD###C#F##
测试结果:
A B D C F
D B A C F
D B F C A
创建出的二叉树为:
创建顺序为:
为什么会创建成这样?
先创建左子树,左子树创建完毕之后才会再创建右子树,虽然代码上看起来两者并列在一起,但是两者不是同步创建的。所以,创建过程是这样的:
-
A是根节点,B是A的左根;
-
D是B的左根;
-
第一个#是D的左根。遇到空节点,说明D的左子树创建完毕,继续给D创建右子树;
-
第二个#是D的右根;
-
回退,第三个#又给B创建一个创建一个空的右根;
-
A的整个左子树创建完毕,接下来创建右子树;
-
C是A的右根,继续给C创建左子树;
-
第4#给C创建空的左子树;
-
给C创建右子树F;
-
给F创建左子树为空;
-
给F创建右子树为空;
-
整棵树创建完毕。
参考:创建二叉树——有趣的递归
欢迎关注上述微信公众号,如有错误可帮忙指正。