给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回

题目:给定一个二叉树其中的一个结点(此节点可以为二叉树任意一个节点),请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。

此二叉树的中序遍历为:8、4、9、2、10、5、1、6、3、7

思路:

(1)如果此结点有右结点:返回 此结点的右结点 的最左的结点(例如4、2)

(2)如果此结点没有右结点:(1)此结点为根节点:返回None

               (2)此结点为上一个结点的左节点:返回上一个结点(例如结点6、8)

               (3)此结点为上一个结点的右节点:(1)此结点在根的左侧:返回上一个结点的上一个结点(例如结点9)

                                 (2)此结点在根的右侧:返回None(例如结点7)

 1 # -*- coding:utf-8 -*-
 2 # class TreeLinkNode:
 3 #     def __init__(self, x):
 4 #         self.val = x
 5 #         self.left = None
 6 #         self.right = None
 7 #         self.next = None
 8 class Solution:
 9     def GetNext(self, pNode):
10         # write code here
11         #如果有右结点:返回右结点的最左
12         if pNode.right:
13             n = pNode.right
14             while n.left:
15                 n = n.left
16             return n
17         #如果没有右结点
18         else:
19             #如果为根结点
20             if pNode.next == None:
21                 return None
22             #如果此结点为上一个节点的左结点
23             if pNode.next.left == pNode:
24                 #返回上一个结点
25                 return pNode.next
26             #如果此结点为上一个节点的右结点
27             else:
28                 n = pNode
29                 #找上一个结点的上一个结点
30                 while n.next.next:
31                     n = n.next
32                 if n.next.left == n:
33                     return pNode.next.next#这里很重要!返回的是上一个结点的上一个结点
34                 else:
35                     return None

原文地址:https://www.cnblogs.com/baibaibaiyou/p/8575283.html

时间: 2024-10-25 05:18:07

给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回的相关文章

【趣味算法题】在数组中,对于所有元素,找出比当前元素大的下一个元素

在数组中,对于所有元素,找出比当前元素大的下一个元素 意思就是,eg.  数组为 3 1 2 5 4 6 7 那么我们需要得到的结果应该是  5 2 5 6 6 7 -1 解决方法如下: 暴力匹配: O (n ^ 2 ) 的效率对所有元素匹配过去,效率非常的低 经过提示, 我想到的一种 O ( nlg n ) 效率的算法 只需要对数组扫描一次,我们用一个 Priority_queue 来得到当前最小的元素 Prority_queue 存放的数据结构为: struct sc { int key,

[PHP] 算法-请找出带环链表的环的入口结点的PHP实现

给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null 1.找链表倒数第k个结点,输入一个链表,输出该链表中倒数第k个结点.第一个指针走(k-1)步,到达第k个节点,两个指针同时往后移动,当第一个结点到达末尾的时候,第二个结点所在位置就是倒数第k个节点了 2.原理有点像上面的,定义两个指针,一个是快指针每次走两步,一个是慢指针每次走一步,当两个相遇的时候,假设环的长度为n个结点,慢指针走x步,快指针走2x步,2x=x+kn ;x=kn; k暂时假定为1圈 ,也就是慢指针slow

二叉树中序遍历的下一个节点

题目描述 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 思路:分多种情况讨论 1 /* 2 struct TreeLinkNode { 3 int val; 4 struct TreeLinkNode *left; 5 struct TreeLinkNode *right; 6 struct TreeLinkNode *next; 7 TreeLinkNode(int x) :val(x), left(NU

58 - 二叉树的中序遍历的下一个节点

题目: 给定一棵二叉树和其中的一个节点,如何找出中序遍历顺序的下一个节点?树中的节点除了由两个分别指向左右节点的指针外,还有一个指向父节点的指针. 中序遍历:先访问当前节点的左子树,再访问当前节点本身,最后访问当前节点的右子树. 因此: 如果给定节点有右子树,则下一个节点是它的右子节点: 如果给定节点没有右子树,需要向上找到一个祖父节点(它是自己父节点的左节点),该祖父节点的父节点就是下一个节点.如果没有找到,返回NULL. 中序遍历顺序为:428591637 如上图中,给定节点9,则无右节点,

算法题——二叉树结点的中序遍历的后继结点

题目:给出二叉树的一个结点,返回它中序遍历顺序的下一个结点. 思路: 如果有指向父亲的结点,则: 如果当前结点有右儿子,或者当前结点是根结点,则后继结点为右子树的最左叶节点: 否则,如果当前结点是父结点的左儿子,则后继结点就是父结点:(其实是第三种情况的一个特例,即自己是第0代祖先,返回第一代祖先) 否则,向上遍历,直到n-1代祖先是n代祖先的左儿子,则后继结点为n代祖先:或者遍历到根节点后未找到符合的n代结点,则该结点为中序遍历的最后结点,没有后继. 时间复杂度为树的高度O(lgN). 代码:

【剑指offer】8、二叉树中序遍历的下一个节点

题目 给定一个二叉树和其中一个节点,找出中序遍历的下一个节点.注意:树的节点中除了有指向左右节点的指针,还有指向父节点的指针. 思路 (1)若该节点Node有右子树,则下一个节点就是右子树中的最左节点,就是在右节点中一直往左子树找. (2)若Node没有右子树 (i)Node是左子节点,则下一个节点就是node的父节点. (ii)Node是右子节点,则下一个节点就要一直向上找,找到第一个左子节点,也就是第一种情况. /* struct TreeLinkNode { int val; struct

【LeetCode每天一题】Construct Binary Tree from Preorder and Inorder Traversal(使用前序和中序遍历构建二叉树)

Given preorder and inorder traversal of a tree, construct the binary tree. Note:You may assume that duplicates do not exist in the tree. For example, given preorder = [3,9,20,15,7] inorder = [9,3,15,20,7] Return the following binary tree: 3 / 9 20 /

题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树

问题描述: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回. 思路: 在二叉树的前序遍历序列中,第一个数字总是树的根结点的值.但在中序遍历序列中,根结点的值在序列的中间,左子树的结点的值位于根结点的值的左边,而右子树的结点的值位于根结点的值的右边.因此我们需要扫描中序遍历序列,才能找到根结点的值. 如下图所示,

输入某二叉树的前序遍历和中序遍历的结果,重建出该二叉树

//================================================================== // <剑指Offer--名企面试官精讲典型编程题>代码 // 作者:何海涛 //================================================================== // 面试题7:重建二叉树 // 题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输 // 入的前序遍历和中序遍历的结果中都