給定乙個二叉樹和其中的乙個結點,請找出中序遍歷順序的下乙個結點並且返回。注意,樹中的結點不僅包含左右子結點,同時包含指向父結點的指標(即next指標)。
【解法】
方法一:暴力解法
1.根據給出的結點求出整棵樹的根節點2.根據根節點遞迴求出樹的中序遍歷,存入vector
3.在vector中查詢當前結點,則當前結點的下一結點即為所求。
雖然有點暴力,但是時間複雜度也是線性的,第一步:最壞為o(n), n為整棵樹結點的個數。第二步:o(n), 第三步:最壞為o(n), 所以整的時間複雜度:3*o(n)
時間複雜度還可以接受,關鍵是思路好想並且每一步的**都很簡單。
/*
struct treelinknode
};*/
class
solution
pre_order
(root-
>left, v)
; v.
push_back
(root)
;pre_order
(root-
>right, v);}
treelinknode*
getnext
(treelinknode* pnode)
vector
> v;
// 第二步
pre_order
(root, v)
;// 第三步
int n = v.
size()
;for
(int i =
0; i < n;
++i)
}return
nullptr;}
};
方法二.最優解法
紅色數字是中序遍歷(左根右)
的順序,其餘空的為沒有的。接下來,我們就假設,如果當前結點分別是1,2 … 7,下一結點看有什麼規律沒?
1 1 =
> 2 // 顯然下一結點是 1 的父親結點
2 2 =
> 3 // 下一節點是當前結點右孩子的左孩子結點,其實你也應該想到了,應該是一直到左孩子為空的那個結點
3 3 =
> 4 // 跟 2 的情況相似,當前結點右孩子結點的左孩子為空的那個結點
4 4 =
> 5 // 5 是父親結點 3 的父親結點,發現和1有點像,因為 1,3,同樣是父親結點的左孩子
5 5 =
> 6 // 跟 4=
>5 一樣的道理
6 6 =
> 7 // 跟 3=
>4 一樣的道理
7 7 =
> null // 因為屬於最尾結點
此時,可以總結一下:[1] 是一類:特點:當前結點是父親結點的左孩子
[2 3 6] 是一類,特點:當前結點右孩子結點,那麼下一節點就是:右孩子結點的最左孩子結點,如果右孩子結點沒有左孩子就是自己
[4 5]是一類,特點:當前結點為父親結點的右孩子結點,本質還是[1]那一類
[7]是一類,特點:最尾結點
class
solution
// 屬於[2 3 6]類 結點往樹的下面的層走
if(pnode-
>right)
return pnode;
}// 屬於 [1] 和 [4 5]
while
(pnode-
>next)
pnode = pnode-
>next;
}// 屬於[7]
return
nullptr;}
};
JZ57 二叉樹的下乙個結點
題目描述 給定乙個二叉樹和其中的乙個結點,請找出中序遍歷順序的下乙個結點並且返回。注意,樹中的結點不僅包含左右子結點,同時包含指向父結點的指標。題解 1 輸入的是二叉樹中的某一結點,先遍歷到二叉樹的最末尾結點。2 樹中包含指向父結點的指標,可以根據此特性中序遍歷構造二叉樹。3 二叉樹構建好之後,遍歷...
JZ57 二叉樹的下乙個結點
給定乙個二叉樹其中的乙個結點,請找出中序遍歷順序的下乙個結點並且返回。注意,樹中的結點不僅包含左右子結點,同時包含指向父結點的next指標。輸入 8 返回值 9輸入 6 返回值 7輸入 5 返回值 null 說明 不存在,後台列印 null 給了二叉樹的層次遍歷,以及其中的某個結點,求中序遍歷該結點...
57 二叉樹的下乙個結點
題目描述 給定乙個二叉樹和其中的乙個結點,請找出中序遍歷順序的下乙個結點並且返回。注意,樹中的結點不僅包含左右子結點,同時包含指向父結點的指標。思路 1 如果該結點為空,則返回空 2 如果該結點存在右結點,則從其右結點開始,沿著其右結點的左結點找,一直找到最左的結點,返回最左的結點 3 如果該結點不...