二叉树的下一个结点(二叉树中序遍历的使用)

题目描述

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


题意分析:根据题意可知,要查找的是中序遍历当前给定结点的下一个结点。

第一种方法,使用递归先把二叉树中序遍历的结果都查找出来,记录,然后对结果进行遍历,查找给定的结点的下一个结点,如果说要查找的结点不是位于结尾,则证明有下一个结点,否则没有。

# -*- 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



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是C语言实现线索二叉树的代码: ``` typedef struct ThreadNode { ElemType data; struct ThreadNode *lchild, *rchild; int ltag, rtag; // 线索标记 }ThreadNode, *ThreadTree; void InThread(ThreadTree p, ThreadTree &pre) { // 线索化 if (p) { InThread(p->lchild, pre); // 递归左子树线索化 if (!p->lchild) { p->lchild = pre; // 左指针为空,建立前驱线索 p->ltag = 1; } if (pre && !pre->rchild) { pre->rchild = p; // 右指针为空,建立后继线索 pre->rtag = 1; } pre = p; InThread(p->rchild, pre); // 递归右子树线索化 } } ThreadTree CreateInThread() { // 创建线索二叉树 ThreadTree T = NULL, pre = NULL; ElemType ch; scanf("%c", &ch); if (ch == '#') return NULL; T = (ThreadNode*)malloc(sizeof(ThreadNode)); T->data = ch; T->ltag = T->rtag = 0; T->lchild = T->rchild = NULL; InThread(T->lchild, pre); // 递归左子树 if (pre) pre->rchild = NULL; // 处理遍的最后一个点 pre = NULL; InThread(T->rchild, pre); // 递归右子树 if (pre) pre->rchild = NULL; // 处理遍的最后一个点 return T; } ThreadTree FirstNode(ThreadTree p) { // 返回的第一个点 while (p->ltag == 0) p = p->lchild; return p; } ThreadTree NextNode(ThreadTree p) { // 返回的后继点 if (p->rtag == 0) return FirstNode(p->rchild); else return p->rchild; } void InOrder(ThreadTree T) { // for (ThreadTree p = FirstNode(T); p != NULL; p = NextNode(p)) printf("%c ", p->data); } ``` 注意:这是一个不带头点的线索二叉树使用时需要把最左侧的点的 `ltag` 设置为 `1`,把最右侧的点的 `rtag` 设置为 `1`。另外,如果要自己输入二叉树,需要在每个元素后面加空格。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值