JZ57 二叉樹的下乙個結點

2021-10-11 21:13:43 字數 2107 閱讀 4779

給定乙個二叉樹和其中的乙個結點,請找出中序遍歷順序的下乙個結點並且返回。注意,樹中的結點不僅包含左右子結點,同時包含指向父結點的指標(即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 如果該結點不...