第57——二叉树的下一个节点

350 阅读1分钟

题目:

给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。

思路:

根据中序遍历二叉树的特点,可分两种情况。 1.该节点有右孩子,找其右子树的最左端; 2.该节点无右孩子,若其为左孩子,那么返回其父节点;否则返回其祖宗节点。

Java

package nowcoder;

class TreeLinkNode {
    int val;
    TreeLinkNode left = null;
    TreeLinkNode right = null;
    TreeLinkNode next = null;
    TreeLinkNode(int val) {
        this.val = val;
    }
}
public class S57_GetNext {
    public TreeLinkNode getNext(TreeLinkNode pNode){
        TreeLinkNode node;
        if (pNode == null)
            return null;
        if (pNode.right != null){
            pNode = pNode.right;
            while (pNode.left != null)
                pNode = pNode.left;
            return pNode;
        }
        while (pNode.next != null){
            node = pNode.next;
            if (pNode == node.left)
                return node;
            else
                pNode = node;
        }
        return null;
    }
}

Python

class TreeLinkNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None
        self.next = None
class GetNext:
    def getNext(self, pNode):
        node = pNode
        while node.next:
            node = node.next
        self.result = []
        self.midTraversal(node)
        return self.result[self.result.index(pNode)+1] if self.result.index(pNode) != len(self.result) -1 else None
    def midTraversal(self, node):
        if not node:
            return
        self.midTraversal(node.left)
        self.result.append(node)
        self.midTraversal(node.right)