剑指offer之面试题8:二叉树的下一节点

二叉树的下一节点

1、题目

给定一颗二叉树和其中的一个节点,如何找出中序遍历序列的下一个节点?树中的节点除了有两个分别指向左、右子节点的指针,还有一个指向父节点的指针。

输入参数:二叉树的一个节点

输出参数:二叉树的下一个节点

2、解题

这道题的关键在于不同节点下一个节点的寻找方式,这里可分为两个大方向,三种寻找方式

  • 如果该节点右节点存在,那么下一个节点是右子树的最左节点
  • 如果该节点右节点不存在,在父节点存在的前提下
    • 如果该节点是父节点的左节点,那么下一个节点是父节点
    • 如果该节点是父节点的右节点,那么沿着向上遍历,直到搜寻到某个节点,是其父节点的左节点,那么下一个节点是父节点

两个大方向按照所给节点是否有右节点而划分,因为题目是**中序遍历,所以把重点放在左节点是没有意义的**,因为左节点必然已经遍历结束,所以下一个节点应该着眼于右子树上。

3、完整代码
BinaryTreeNode* GetNext(BinaryTreeNode* pNode) {
	//1、鲁棒性检查
	if (pNode == nullptr)
		return nullptr;
	//2、初始化
	BinaryTreeNode* pNext = nullptr;
	BinaryTreeNode* pRight = pNode->m_pRight;
    //3、判断右子树
	if (pRight != nullptr) {
		while (pRight->m_pLeft != nullptr)
			pRight = pRight->m_pLeft;
		pNext = pRight;
	}
    //4、右子树为空,先对父节点做判断
	else if (pNode->m_pParent != nullptr) {
		BinaryTreeNode* current = pNode;
		BinaryTreeNode* parent = pNode->m_pParent;
        //5、寻找那个是父节点的左节点的节点
		while (parent != nullptr && current == parent->m_pRight) {
			current = parent;
			parent = parent->m_pParent;
		}
		pNext = parent;
	}
	//6、返回节点即可
	return pNext;
}
4、注意点
  • 开头的鲁棒性检查
  • 若右子树不存在,则直接else if对父节点进行检查,避免浪费时间
  • 寻找那个是父节点的左节点的节点时,子节点和父节点两个指针交替上行,时刻注意判断父节点是否为空
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值