二叉树的创建

思考:根据中序遍历的结果能创建一颗树吗?

例如:中序遍历结果为: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 }

先序:

 

 

 

中序:

 

 

 后序:

 

 

 

 

 

 

 

 

  

 

posted @ 2020-05-25 13:15  每天都要吃早饭  阅读(597)  评论(0编辑  收藏  举报