题目:
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
思路:
根据中序遍历二叉树的特点,可分两种情况。 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)