由前序遍歷和中序遍歷重建二叉樹(前序序列:1 2 3 4 5 6 - 中序序列:3 2 4 1 6 5)
思路:
前序遍歷第乙個是根節點。
中序遍歷根節點左側為左子樹,根右側為右子樹。
那麼先構造根節點,根節點左側都為左子樹,根右側都為右子樹。
然後對左右子樹遞迴式的構造即可。
//封裝
binarytreenode* construct(int * preorder, int* inorder,int length)
//找根並遞迴構建
binarytreenode* constructcore(int* startpreorder,int* endpreorder,int* startinorder,int* endinorder)
//中序遍歷找根
int *rootinorder = startinorder;
while(rootinorder <= endinorder && *rootinorder != rootvalue)
++rootinorder;
if(rootinorder > endinorder)
return
null;
int leftlength = rootinorder - startinorder;
int * leftpreorderend = startpreorder+leftlength;
//遞迴構建左右子樹
if(leftlength > 0)
root -> left = constructcore(startpreorder+1,leftpreorderend,startinorder,rootinorder-1);
if(leftlength < endpreorder - startpreorder)
root -> right = constructcore(leftpreorderend+1,endpreorder,rootinorder+1,endinorder-1);
return root;
}
由前序遍歷和中序遍歷重建二叉樹
唯一的難點就是確定當前節點的左子樹的根節點和右子樹的根節點分別在前序遍歷陣列的位置。例如 先序遍歷陣列pre 1 2 3 4 5 6 7 中序遍歷陣列in 3 2 4 1 6 5 7 1是當前根節點,它在pre中的位置 pre start 0接著在in中找到1的位置,即分割點 j 3當前樹根所囊括的...
由前序遍歷和中序遍歷重建二叉樹
程式設計之美3.9 給出前序遍歷和中序遍歷,重新建立二叉樹,後序遍歷輸出。如下 view code 1 include 2 include 3 4using namespace std 56 struct node7 1213 void aftertra node proot 1419 aftert...
前序遍歷和中序遍歷重建二叉樹
根據先序序列和中序序列的特點我們可以知道 1 先序的第乙個節點是根節點 2 在中序序列中,根結點前邊的結點都是左子樹中的,根結點右邊的結點都是右子樹中的 3 通過左右子樹的中序序列帶入前序序列可以求出左右子樹的前序序列 4 左右子樹的前序序列第乙個元素分別是根節點的左右孩子 5 可以遞迴上述步驟來重...