二、從中序與後序遍歷序列構造二叉樹
三、二叉搜尋樹轉雙向鍊錶
根據一棵樹的前序遍歷與中序遍歷構造二叉樹。
注意:
你可以假設樹中沒有重複的元素。
例如,給出
前序遍歷 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...