二叉樹構建及雙向鍊錶

2021-10-07 07:25:10 字數 2833 閱讀 8459

二、從中序與後序遍歷序列構造二叉樹

三、二叉搜尋樹轉雙向鍊錶

根據一棵樹的前序遍歷與中序遍歷構造二叉樹。

注意:

你可以假設樹中沒有重複的元素。

例如,給出

前序遍歷 preorder =[3

,9,20

,15,7

]中序遍歷 inorder =[9

,3,15

,20,7

]返回如下的二叉樹:

3/ \ 9

20/ \

157

/**

* definition for a binary tree node.

* struct treenode

* };

*/class

solution

// 前序遍歷中的第乙個節點就是根節點

int preorder_root = preorder_left;

// 在中序遍歷中定位根節點

int inorder_root = index[preorder[preorder_root]];

// 先把根節點建立出來

treenode* root =

newtreenode

(preorder[preorder_root]);

// 得到左子樹中的節點數目

int size_left_subtree = inorder_root - inorder_left;

// 遞迴地構造左子樹,並連線到根節點

// 先序遍歷中「從 左邊界+1 開始的 size_left_subtree」個元素就對應了中序遍歷中「從 左邊界 開始到 根節點定位-1」的元素

root-

>left =

mybuildtree

(preorder, inorder, preorder_left +

1, preorder_left + size_left_subtree, inorder_left, inorder_root -1)

;// 遞迴地構造右子樹,並連線到根節點

// 先序遍歷中「從 左邊界+1+左子樹節點數目 開始到 右邊界」的元素就對應了中序遍歷中「從 根節點定位+1 到 右邊界」的元素

root-

>right =

mybuildtree

(preorder, inorder, preorder_left + size_left_subtree +

1, preorder_right, inorder_root +

1, inorder_right)

;return root;

} treenode*

buildtree

(vector<

int>

& preorder, vector<

int>

& inorder)

return

mybuildtree

(preorder, inorder,

0, n -1,

0, n -1)

;}};

根據一棵樹的中序遍歷與後序遍歷構造二叉樹。

注意:

你可以假設樹中沒有重複的元素。

例如,給出

中序遍歷 inorder =[9

,3,15

,20,7

]後序遍歷 postorder =[9

,15,7

,20,3

]返回如下的二叉樹:

3/ \ 9

20/ \

157

/**

* definition for a binary tree node.

* struct treenode

* };

*/class

solution

treenode *

build

(vector<

int>

& inorder, vector<

int>

& postorder,

int inl,

int inr,

int pl,

int pr)

};

輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向

/*

struct treenode

};*/

class

solution

//找到最左側節點

treenode* cur = prootoftree;

if(cur-

>left)

//cur:當前判斷節點,也是雙向鍊錶當中的後乙個節點

//這一步相當於雙向鍊錶當中的鏈結prev指標,即後乙個節點鏈結前乙個節點

cur-

>left =

*head;

//當第一次走到這裡時cur->left肯定是空,需要判斷if(

*head)

//head也同步往後

*head = cur;

//判斷右子樹,遞迴進行

if(cur-

>right)

//注意隨著head不斷往後,得到的雙向鍊錶剛好是反的,head指標指向的位置是二叉樹的最由節點

}

treenode*

convert

(treenode* prootoftree)

return head;}}

;

二叉樹轉雙向鍊錶

include using namespace std 樹節點 struct node typedef struct node link 構造樹 void insert tree link h,int t if h val t insert tree h left,t else insert tre...

二叉樹轉雙向鍊錶

1.a 遞迴轉化左子樹為雙向鍊錶 1.b 找出根結點的前驅節點 是左子樹的最右的節點 1.c 將上一步找出的節點和根結點連線起來 2,如果右子樹不為null,處理右子樹 和上面的很類似 1.a 遞迴轉化右子樹為雙向鍊錶 1.b 找出根結點的後繼節點 是右子樹的最左的節點 1.c 將上一步找出的節點和...

二叉樹轉雙向鍊錶

這是一道挺有趣的題,其解題的思路主要還是二叉樹的中序遍歷 先建立乙個頭結點list,然後通過中序遍歷二叉樹,把結點串起來即可!注意點 1 需要有乙個指標來指向上乙個已遍歷過的結點 2 如果不建立頭結點,在後面遍歷判斷時比較麻煩 include using namespace std struct n...