通过先序中序求出后序遍历
2021-11-25 22:55:38
因为从先序遍历的第一个是根节点,然后把中序遍历得到的数组分成了两部分,左边的左子树的所有节点,右边是右子树的所有节点。然后在根据先序遍历,因为是 根节点->左子树->右子树 第二个节点(如果中序的左边还有值)一定是左子树的节点。用它当做根节点依次重复就好了。依次重复就好了,需要注意区间的选择
#include<bits/stdc++.h> using namespace std; typedef struct NNN { int data; NNN* lnext = nullptr; NNN* rnext = nullptr; }trees; int a[10] = { 1,2,3,4,7,8,9,11,13,15 };//这个是中序遍历得到的数组 int b[10] = { 7,3,1,2,4,9,8,13,11,15 };//这个是先序遍历得到的数组 int cno = 0; void after(trees* p) { if (p->lnext != nullptr && p->rnext != nullptr) { after(p->lnext); after(p->rnext); cout << p->data << " "; } } void rebuild(trees* p, int left, int right) {//确定一个区间然后取出根节点分成两部分来处理,有点像快速排序那样 for (int i = left; i < right; i++) { if (a[i] == b[cno]) { p->data = a[i]; p->lnext = new trees; p->rnext = new trees;//这里写得不好,但是凑合一下吧懒得改了 cno++;// rebuild(p->lnext, left, i); rebuild(p->rnext, i + 1, right); break; } } } int main() { trees* Tree = new trees; trees* head = Tree; rebuild(Tree, 0, 10); after(head); }
//不知道以后会不会想到更好的办法,第一次写博客,不会画那个图...