面试真题录:判断一个节点数组是否在同一棵二叉树中?

前言:20200924,某A姓世界一线大厂面试真题:“给出一个树节点序列,判断该序列的所有节点是否在同一个二叉树上?”
面试官循循善诱,然而我当时没想到啥好的解法,直接说了个遍历每个节点数组,进行层序遍历,统计以该节点为根节点的树的节点个数。(显然复杂度很高)

以下为杂文,并不一定给出解法。

先思考子问题:如何判断一个节点node是否在某个给定的根节点为root的树上?

1.1 判断一个节点node是否在一颗根节点为root的树上?

递归即可。node在树上,则判断node是否等于tree,否则查看node是否在左右子树上。
代码如下:

bool IsNodeInTree(TreeNode* pRoot,TreeNode* pNode)
{
     if(pRoot == NULL || pNode ==NULL)
          return false;

     if(pRoot == pNode)
          return true;

     if( IsNodeInTree(pRoot -> left,pNode) || IsNodeInTree(pRoot -> right,pNode) )
          return true;

     return false;
}

在思考:如何判断两个节点node1node2是否在同一颗树上?

1.2 判断两个节点是否在同一颗树上

node1node2表示两个节点。

  1. 其中一个为根节点,另一个在该树上
    1.1中,交换顺序,互相判断即可。
  2. 两个均为子节点,在同一颗以第三个节点root的树上。
    如果进给此两个节点,该情况是无解的。(自动忽略)

进而思考:如何判断一颗树root1是另一个颗树的子树root2?

1.3 如何判断一颗树root1是另一个颗树的子树root2?

判断集合从属关系,不禁想起并查集unionFind
仔细想来,这些零星的树节点,应该构成一个,并且是有向图(从属关系),这部分我确实不擅长。
并查集中主要包含:初始化,路径压缩find,合并unionTwo,判断是否为统一集合isConnect 四种方法。

目前思路:先初始化并查集,随后使用1.1中方法构建表示有向图的邻接矩阵的边,即以下标为i的节点为根节点,依次判断序列中其余节点是否在该树上。这一过程,复杂度将为N\*N\*(1.1递归的时间复杂度)
随后进行路径压缩find,得到每个节点所在树的根节点的编号。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值