用Python编写程序实现给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向 父结点的指针。
时间: 2024-05-06 12:16:10 浏览: 77
题目分析:
1. 如果该节点有右子树,那么它的下一个节点就是它右子树中最左边的节点。
2. 如果没有右子树,分两种情况:
a. 如果该节点是父节点的左孩子,那么它的下一个节点就是它的父节点。
b. 如果该节点是父节点的右孩子,那么就需要沿着指向父节点的指针一直向上遍历,直到找到一个节点是它父节点的左孩子,那么它的下一个节点就是这个节点的父节点。
代码实现如下:
```python
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
self.parent = None
class Solution:
def getNext(self, pNode):
if not pNode:
return None
if pNode.right: # 有右子树
node = pNode.right
while node.left:
node = node.left
return node
else:
while pNode.parent: # 没有右子树
if pNode.parent.left == pNode:
return pNode.parent
pNode = pNode.parent
return None
```
测试代码如下:
```python
if __name__ == '__main__':
# 建立二叉树
root = TreeNode(1)
root.left = TreeNode(2)
root.right = TreeNode(3)
root.left.parent = root
root.right.parent = root
root.left.left = TreeNode(4)
root.left.right = TreeNode(5)
root.left.left.parent = root.left
root.left.right.parent = root.left
# 测试
s = Solution()
print(s.getNext(root.left.left).val) # 2
print(s.getNext(root.left).val) # 5
print(s.getNext(root.left.right).val) # 1
print(s.getNext(root.right)) # None
```
输出结果:
```
2
5
1
None
```
阅读全文