二叉树的下一个结点(二叉树中序遍历的使用)
2017-01-29 00:08
218 查看
题目描述
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。题意分析:根据题意可知,要查找的是中序遍历当前给定结点的下一个结点。
第一种方法,使用递归先把二叉树中序遍历的结果都查找出来,记录,然后对结果进行遍历,查找给定的结点的下一个结点,如果说要查找的结点不是位于结尾,则证明有下一个结点,否则没有。
# -*- 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 def Get_In_Order(root): u"获取二叉树的中序遍历" if root.left: Get_In_Order(root.left) res.append(root) if root.right: Get_In_Order(root.right) if not pNode: return None temp = pNode # 获取根结点 while temp.next: temp = temp.next res = [] Get_In_Order(temp) # 查找中序遍历序列 for index, value in enumerate(res): # 遍历中序序列,找到下一个节点 if value == pNode: if index < len(res) - 1: # 需要查找的结点不是最后一个结点 return res[index + 1] return None
第二种方法,使用循环进行查找
两个方向进行讨论:
1.如果当前结点的右结点不为空,则往右结点方向进行遍历,如图所示
遍历到右结点以后,遍历右结点的左结点,一直到左结点的叶子结点
2.如果当前结点的右结点为空,则往上遍历,查找父结点,如果父结点的左子树等于给定结点的话,则该父结点就是要查找的结点,否则的话,则继续查找,要对每一步进行判断父结点的左子树是否等于给定结点,如果相等,则该结点就是要查找的结果,否则,当循环结束以后,则证明没有找到,返回None。
# -*- 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 not pNode: return None p = pNode if p.right: if not p.right.left: return p.right pr = p.right # 一直遍历该右结点的左子树,直到遍历到叶子结点,此时获得的结点就是pNode的下一个结点 # while循环的两个条件不能少,第一个是要得到的结果,第二个只有不为空的时候才能给pr赋值 while pr and pr.left: pr = pr.left return pr else: if p.next: # p结点是父结点的左子树上的结点,则直接返回父结点 if p.next.left == p: return p.next while p.next: # 继续遍历父结点 # 这种情况的解释看图示 if p.next.left and p.next.left == p: return p.next p = p.next return None
相关文章推荐
- 剑指offer--二叉树的下一个结点
- 面试题58:二叉树的下一个结点
- 二叉树的下一个结点
- 二叉树的下一个结点
- 面试题58 二叉树的下一个结点
- 二叉树的下一个结点
- [剑指offer]二叉树的下一个结点
- 二叉树的下一个结点
- 二叉树的下一个结点
- 剑指offer:二叉树的下一个结点
- 《剑指Offer》学习笔记--面试题58:二叉树的下一个结点
- 二叉树的下一个结点
- 二叉树的下一个结点
- 《剑指offer》——二叉树的下一个结点
- 二叉树的下一个结点
- 反转二叉树,即交换所有结点的左右子树,但不能使用递归方法。
- (剑指Offer)面试题58:二叉树的下一个结点
- 《剑指offer》二叉树的下一个结点
- 《剑指offer》-- 二叉树的下一个结点
- 二叉树的下一个结点