根據先序序列和中序序列的特點我們可以知道:
1、先序的第乙個節點是根節點
2、在中序序列中,根結點前邊的結點都是左子樹中的,根結點右邊的結點都是右子樹中的
3、通過左右子樹的中序序列帶入前序序列可以求出左右子樹的前序序列
4、左右子樹的前序序列第乙個元素分別是根節點的左右孩子
5、可以遞迴上述步驟來重建二叉樹
具體**實現:
//前序+中序重建二叉樹
binarytreenode* _rebuildtree(int *start_pre, int *end_pre, int *start_in, int *end_in)
//在中序序列中找到根節點,根節點左側為左子樹,右側為右子樹
int *root = start_in;
while (root <= end_in && *root != root_val)//中序序列中找根節點
root++;
int leftlen = root - start_in;//左子樹的size
int *left_end = start_pre + leftlen;//在前序序列中劃分左子樹
if (leftlen > 0)//構建左子樹
if (leftlen < end_pre - start_pre)//構建右子樹
return proot;
}
由前序遍歷和中序遍歷重建二叉樹
唯一的難點就是確定當前節點的左子樹的根節點和右子樹的根節點分別在前序遍歷陣列的位置。例如 先序遍歷陣列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當前樹根所囊括的...
據前序遍歷和中序遍歷重建二叉樹
這是一道面試題 由前序遍歷和中序遍歷重建二叉樹 前序序列 1 2 3 4 5 6 中序序列 3 2 4 1 6 5 資料不含重複值 這個可以分析一下 前序遍歷序列 1 2 3 4 5 6 前序遍歷規則是根 左 右 中序遍歷序列 3 2 4 1 6 5 中序遍歷規則是左 根 右 由前序遍歷可知根節點為...
根據前序遍歷和中序遍歷重建二叉樹
輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。class treenode public class s2 public treenode reconstruct int pre...