重建二叉樹

2021-06-28 06:45:01 字數 1423 閱讀 8572

1.問題描述

輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出改二叉樹。假設輸入的前序遍歷序列和中序遍歷序列的結果中都不包含重複的數字。例如輸入前序遍歷的序列{1,2,4,7,3,5,6,8}和中序遍歷的序列{4,7,2,1,5,3,,8,6},則重建出二叉樹,並輸出它的頭結點。(來自《劍指offer》)

2.分析

由於我們知道二叉樹的先序和中序序列。先序 1,2,4,7,3,5,6,8。中序4,7,2,1,5,3,8,6 。那麼先序中的第乙個結點 1 為樹的根,接下來找到 1 在中序序列中的位置,在  1  前面的序列為左子樹,在1後面的序列為右子樹,然後在左右子樹中在繼續重複這個過程,直到樹被重建成功。

3.**

#include #include typedef int data;

typedef struct node

tree;

// 查詢key在陣列中的位置。從1開始計數,如果為0說明未查找到。

int getlocationinarray(int* array, data key, int length)

int index = 1;

while (index <= length)

index ++;

}return 0;

}//length代表樹或子樹在先序或中序序列陣列中佔的長度

tree* rebuildtree(int* preorder, int* inorder,int length)

tree *root = (tree*)malloc(sizeof(tree));

root->data = *(preorder);

int location = getlocationinarray(inorder, root->data, length);

if(location == 0)

root->lchild = rebuildtree(preorder + 1, inorder, location-1);

root->rchild = rebuildtree(preorder + location, inorder + location, length-location);

return root;

}

二叉樹中 有乙個堆和紅黑樹。堆分為最大堆和最小堆,最大堆中根結點的值最大,最小堆中根結點的值最小。很多需要快速找到最大值和最小值的問題都可以用堆來解決。

紅黑樹 是把 樹中的結點定義為紅,黑倆種顏色,並通過規則確保從根結點到葉結點的最長路徑長度不超過最短路徑長度的兩倍。在c++的stl中,set multiset map multimap等都是基於紅黑樹實現的。

二叉樹 重建二叉樹

問題 給定二叉樹的前序遍歷結果和中序遍歷結果,恢復出原二叉樹。假設二叉樹中的元素都不重複,給定二叉樹的前序遍歷序列,二叉樹的中序遍歷序列。看到此題,我首先想到的是尋找根節點,由前序遍歷序列可以看出根節點為1,此時通過中序遍歷可以看出來4,7,2在根節點的左子樹,5,3,8,6在樹的右節點。此時我們可...

二叉樹 重建二叉樹

題目給定兩個陣列,乙個是前序遍歷陣列 preorder 乙個是中序遍歷陣列 inorder 要求輸出還原二叉樹 核心在於我們要理解前序和中序便利的特點 前序遍歷 根節點 左節點 右節點 中序遍歷 左節點 根節點 右節點 所以我們從二叉樹的根節點開始重構 也就是preorder的第乙個值 同時用乙個m...

二叉樹重建

摘自劉汝佳的 演算法競賽入門經典 preorder t t 的根結點 preorder t 的左子樹 preorder t 的右子樹 inorder t inorder t 的左子樹 t 的根結點 inorder t 的右子樹 postorder t postorder t 的左子樹 postord...