1. 程式人生 > >劍指offer之二叉樹的下一個結點

劍指offer之二叉樹的下一個結點

1.題目描述

給定一個二叉樹和其中的一個結點,請找出中序遍歷順序的下一個結點並且返回。注意,樹中的結點不僅包含左右子結點,同時包含指向父結點的指標。

2.問題分析

3.原始碼

// 例如:  1
//     2     3
//  4      6   7
// 中序遍歷是 4 2 1 6 3 7

我們分成兩種情況:

  • 一種是:該節點的右子樹不為空,查詢該右子樹的中序遍歷的第一個節點,即:最左節點。例如:pNode是1,那麼下一個節點就是6;
  • 另外一種是:該節點的右子樹為空,那麼需要回溯到該節點的父節點,來查詢。如果pNode是2,那麼下一個節點應該是1,我們發現1的左節點就是2節點,所以下一個節點是1。
TreeLinkNode* GetNext(TreeLinkNode* pNode)
{
    if(pNode == NULL)
        return NULL;
    //右子樹存在,找右子樹的中序遍歷第一個節點,即:第一個左節點為空的節點
    if(pNode->right != NULL)
    {
        TreeLinkNode* pRoot = pNode->right;
        while(pRoot->left != NULL)
            pRoot = pRoot->left;
        return
pRoot; } else { //找到第一個父節點的左節點與該節點相等,那麼該父節點就是我們要找的下一個節點 // 例如: 1 // 2 3 // 4 6 7 // 中序遍歷是 4 2 1 6 3 7 //如果pNode是2,那麼下一個節點應該是1,我們發現1的左節點就是2節點,所以下一個節點是1 while(pNode->next != NULL) { TreeLinkNode* parent = pNode->
next; if(parent->left == pNode) return parent; pNode = parent; } return NULL; } }