查找二叉树任意两个节点的父节点

做一个容器,我们在遍历二叉树寻找节点的同时,把从根到节点的路径扔进去(两个节点就是两个容器)。由于根节点最后一个被扔进去,但我们接下来又需要第一个就能访问到它——后进先出,所以这个容器是一个栈。时间复杂度O(N),空间复杂度O(N)。

代码

public class BinNode
{
     public int Element;
     public BinNode Left;
     public BinNode Right;
     public BinNode(int element, BinNode left, BinNode right)
     {
         this.Element = element;
         this.Left = left;
         this.Right = right;
     }

static bool GetPositionByNode(BinNode root, BinNode node, ref Stack stack)
{
     if (root == null)
         return false;
     if (root == node)
     {
         stack.Push(root);
         return true;
     }
     if (GetPositionByNode(root.Left, node, ref stack) || GetPositionByNode(root.Right, node, ref stack))
     {
         stack.Push(root);
         return true;
     }
     return false;
}

然后我们要同时弹出这两个容器的元素,直到它们不相等,那么之前那个相等的元素就是我们要求的父亲节点。

代码

static BinNode FindParentNode(BinNode root, BinNode node1, BinNode node2)
{
     Stack stack1 = new Stack();
     GetPositionByNode(root, node1, ref stack1);
     Stack stack2 = new Stack();
     GetPositionByNode(root, node2, ref stack2);
     BinNode tempNode = null;
     while (stack1.Peek() == stack2.Peek())
     {
         tempNode = (BinNode)stack1.Pop();
         stack2.Pop();
     }
     return tempNode;
}

转载于:https://www.cnblogs.com/hongwei8455/p/3658577.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值