面試8:找二叉樹的下個結點

lightmare625發表於2018-07-17

關鍵是舉例和畫圖的思想。

主要分三種型別。

1.有右子樹:返回 右子樹的最左節點。

2.無右子樹:2.有父節點:2.是左結點:返回 父節點。

3.無右子樹:3.有父節點:3.是右節點:找到第一個是左結點的節點,返回 該節點的父節點。//這裡的while我出了個bug

4.無右子樹:4.無父節點:返回 空。

 

 

我的程式碼。 

/*
struct TreeLinkNode {
    int val;
    struct TreeLinkNode *left;
    struct TreeLinkNode *right;
    struct TreeLinkNode *next;
    TreeLinkNode(int x) :val(x), left(NULL), right(NULL), next(NULL) {
        
    }
};
*/
class Solution {
public:
    TreeLinkNode* GetNext(TreeLinkNode* pNode)
    {
        //空
        if(pNode == nullptr) return nullptr;
        //初試化下個節點
        TreeLinkNode* pnext = nullptr;
        //有右子樹
        if(pNode->right != nullptr)
        {
            pnext = pNode->right;
            while(pnext->left != nullptr)
                pnext = pnext->left;
        }
        //無右子樹
        else 
        {
            //有父節點
            if(pNode->next != nullptr)
            {
                TreeLinkNode* parent = pNode->next;
                //是左子樹
                if(pNode == parent->left) pnext = parent;
                //是右子樹
                else if(pNode == parent->right)
                {
                    TreeLinkNode* current = pNode;
                    parent = current->next; 
                    while(parent != nullptr && current == parent->right)
                        {    
                            current = current->next;
                            parent = current->next;//bug1這裡父節點也變了
                        } 
                    pnext = current->next;
                } 
            }
            //無父結點
            else
            {
                pnext = nullptr;
            }
        }
        return pnext;
    }
};

 

 

網友的python程式碼

#1.有右子樹,返回 右子樹最左邊的結點       

#2.無右子樹,返回 當前結點成為左子樹跟時的父節點

# -*- coding:utf-8 -*-
# class TreeLinkNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
#         self.next = None
class Solution:
    def GetNext(self, pNode):
        # write code here
        if pNode is None:
            return None
        #1.有右子樹,為右子樹最左邊的結點
        if pNode.right is not None:
            node=pNode.right
            while node.left is not None:
                node=node.left
            return node
        #2.無右子樹,為當前結點成為左子樹跟時的父節點
        if pNode.next is not None:
            cur_node=pNode
            parent_node=pNode.next
            while parent_node is not None and parent_node.left!=cur_node:
                cur_node=parent_node
                parent_node=cur_node.next
            return parent_node
        return None

第二種思路

如果無右子樹且父節點存在,只要找到為左結點的節點就好了,返回該節點的父節點。

class Solution:
    def GetNext(self, pNode):
        # write code here
        if pNode is None:
            return None
        if pNode.right is not None:
            pNode = pNode.right
            while pNode.left is not None:
                pNode = pNode.left
            return pNode
        while pNode.next is not None:
            if pNode.next.left == pNode:
                return pNode.next
            pNode = pNode.next
        return None

 

相關文章