只知道先序序列和后序序列是无法求出唯一的树,所以不做讨论。
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125#include<iostream> #include<cstdio> #include<cstring> using namespace std; struct BinaryTreeNode { char c; BinaryTreeNode *lchild, *rchild; BinaryTreeNode() { lchild = NULL, rchild = NULL; } }; struct BinaryTreeNode *root1,*root2; char preorder[100], inorder[100], postorder[100]; void preSearch(BinaryTreeNode *root) //先序遍历树 { if(root != NULL) { printf("%c", root->c); preSearch(root->lchild); preSearch(root->rchild); } return ; } void midSearch(BinaryTreeNode *root) //中序遍历树 { if(root != NULL) { midSearch(root->lchild); printf("%c", root->c); midSearch(root->rchild); } return ; } void postSearch(BinaryTreeNode *root) //后序遍历树 { if(root != NULL) { postSearch(root->lchild); postSearch(root->rchild); printf("%c", root->c); } return ; } void BuildTreeFromPreAndMid(BinaryTreeNode * &root, int ll, int lr, int len, int &now)//根据中序和先序求树 { root = new BinaryTreeNode(); root->c = *(preorder + now); int pos = (int)(strchr(inorder, *(preorder + now)) - inorder); //查找字符串中首次出现某个字符的位置 now++; if(now >= len) return ; if(pos - 1 >= ll) { BinaryTreeNode *t = new BinaryTreeNode(); root->lchild = t; BuildTreeFromPreAndMid(root->lchild, ll, pos - 1, len, now); } if(pos + 1 <= lr) { BinaryTreeNode *t = new BinaryTreeNode(); root->rchild = t; BuildTreeFromPreAndMid(root->rchild, pos + 1, lr, len, now); } } void BuildTreeFromPostAndMid(BinaryTreeNode * &root, int ll, int lr, int len, int &now)//根据中序和后序求树 { root = new BinaryTreeNode(); root->c = *(postorder + now); int pos = (int)(strchr(inorder, *(postorder + now)) - inorder); now--; if(now < 0) return ; if(pos + 1 <= lr) { BinaryTreeNode *t = new BinaryTreeNode(); root->rchild = t; BuildTreeFromPostAndMid(root->rchild, pos + 1, lr, len, now); } if(pos - 1 >= ll) { BinaryTreeNode *t = new BinaryTreeNode(); root->lchild = t; BuildTreeFromPostAndMid(root->lchild, ll, pos - 1, len, now); } } //释放二叉树 inline void DeleteBinaryTree(BinaryTreeNode * &root) { if(root) { DeleteBinaryTree(root->lchild); //释放左子树 DeleteBinaryTree(root->rchild); //释放右子树 delete root; //释放根结点 } } int main(void) { gets(preorder); gets(inorder); //gets(postorder); int now = 0; BuildTreeFromPreAndMid(root1, 0, strlen(preorder) - 1, strlen(preorder), now); //int now2 = strlen(postorder)-1; //BuildTreeFromPostAndMid(root2, 0, strlen(postorder) - 1, strlen(postorder), now2); postSearch(root1); puts(""); DeleteBinaryTree(root1); /*preSearch(root2); puts(""); DeleteBinaryTree(root2);*/ return 0; }
最后
以上就是飘逸小刺猬最近收集整理的关于根据树的两种遍历序列求第三种遍历序列的全部内容,更多相关根据树内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复