二叉树的创建
思考:根据中序遍历的结果能创建一颗树吗?
例如:中序遍历结果为:12345 ;这个123456能确定一颗树吗? 答案:不能。
所以如何才能确定一棵树?
结论:【1】通过中序遍历和先序遍历可以确定一个树;
【2】通过中序遍历和后续遍历可以确定一棵树;
【3】通过先序遍历和后续遍历确定不了一棵树。
注意*:通过先序遍历结果可以知道根;
例:先序遍历结果:ADEBCF; 中序遍历结果:DEACFB
思路:【1】由先序结果知道A为根节点,再由中序遍历结果可以知道D,E是在左子树上CFB是在右子树上;
【2】回到先序遍历结果(中左右),D在A的后面说明A的左子树就是D但无法确定E是在D的左子树还是右子树上;
【3】无法判断E的位置,此时回到中序遍历(左根右),D在E的前面则确定E在D的右子树上,至此左子树确定;
【4】由先序可知B是A的右子树,但同样无法确定CF的位置,结合中序遍历【左根右】所以CF实在B的左子树上;
【5】回到先序B后面紧跟的是C所以B的左子节点是C但同样无法确定F的位置,结合中序遍历F在C的后面从而确定F为C的右子树,至此树的创建完成
二叉树的井号创建法:可以根据先序遍历的结果创建一颗唯一二叉树例如:
先序结果为:ABC###D#E#F## 唯一对应的一个二叉树为下图所示 ,
先序遍历结果为:ABCDEF
中序:CBADEF
后序:CBFEDA
1 /*给定一个先序遍历结果,创建一颗二叉树*/ 2 #include<iostream> 3 using namespace std; 4 5 //二叉树节点 6 struct BinaryNode 7 { 8 char ch; 9 BinaryNode* lchild; 10 BinaryNode* rchild; 11 }; 12 //遍历树(先序遍历) 13 void Recursion(BinaryNode* root) { 14 if (root == NULL) { 15 return; 16 } 17 cout << root->ch << " "; 18 Recursion(root->lchild); 19 Recursion(root->rchild); 20 } 21 22 23 //根据先序遍历结果创建一颗树 24 BinaryNode* CreateBinaryTree() { 25 fflush(stdin); 26 char ch; 27 BinaryNode* node; 28 cin >> ch; 29 if (ch == '#') return NULL; 30 else 31 { 32 node = new BinaryNode; 33 node->ch = ch; 34 node->lchild = CreateBinaryTree(); 35 node->rchild = CreateBinaryTree(); 36 } 37 return node; 38 } 39 //根据后续遍历释放二叉树 40 void FreeTree(BinaryNode* root) { 41 if (root) { 42 if (root->lchild) { 43 FreeTree(root->lchild); 44 root->lchild = NULL; 45 } 46 if (root->rchild) { 47 FreeTree(root->rchild); 48 root->rchild = NULL; 49 } 50 if (root) { 51 delete(root); 52 root = NULL; 53 } 54 } 55 } 56 int main() { 57 BinaryNode*newnode=CreateBinaryTree(); 58 Recursion(newnode); 59 FreeTree(newnode); 60 return 0; 61 }
先序:
中序:
后序:
记录学习点滴,如有违规请告知。