博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(算法)二叉树中两个结点的最近公共父结点
阅读量:6826 次
发布时间:2019-06-26

本文共 1930 字,大约阅读时间需要 6 分钟。

题目:

二叉树中两个结点的最近公共父结点

二叉树结点的定义如下:

struct TreeNode{  int val;  TreeNode *left;  TreeNode *right;};

思路:

前面在剑指Offer中出现了类似的题目,但要求的思路都不太一样,请参考:http://www.cnblogs.com/AndyJee/p/4693045.html。

这里介绍一种复杂度较低的递归实现。

如题我们要找的二叉树中两个结点的最近公共结点,如果我们从上往下递归,按照深度优先搜索的方式。

如果当前结点为空,即遍历到了叶子结点,直接返回NULL;

如果当前结点等于两个结点之一,那么返回该结点;(因为是从上往下遍历,说明上面的结点都还没找到这两个结点)

如果上面两种情况都不满足,那么两个结点必然存在当前结点的左子树或者右子树或者左右子树当中。

  递归遍历左子树,得到pLeft;

  递归遍历右子树,得到pRight;

  如果pLeft==NULL,则返回pRight;

  如果pRight==NULL,则返回pLeft;

  如果pLeft,pRight都不为NULL,则返回pRoot;

  (先从上往下遍历,再从下往上回溯)

代码:

#include 
#include
#include
#include
using namespace std;struct TreeNode{ int val; TreeNode *left; TreeNode *right;};void CreateBiTree(TreeNode *&pNode,fstream &fin,TreeNode *&pNodeOne,TreeNode *&pNodeTwo){ int dat; fin>>dat; if(dat==0) pNode==NULL; else{ pNode=new TreeNode(); pNode->val=dat; if(pNodeOne==NULL && !(rand()%3)) pNodeOne=pNode; if(pNodeTwo==NULL && !(rand()%5)) pNodeTwo=pNode; CreateBiTree(pNode->left,fin,pNodeOne,pNodeTwo); CreateBiTree(pNode->right,fin,pNodeOne,pNodeTwo); }}TreeNode* FindFirstCommonParentNode(TreeNode* pRoot,TreeNode* pNodeOne,TreeNode* pNodeTwo){ if(pRoot==NULL) return NULL; if(pRoot==pNodeOne || pRoot==pNodeTwo) return pRoot; TreeNode* pLeft; TreeNode* pRight; pLeft=FindFirstCommonParentNode(pRoot->left,pNodeOne,pNodeTwo); pRight=FindFirstCommonParentNode(pRoot->right,pNodeOne,pNodeTwo); if(pLeft==NULL) return pRight; else if(pRight==NULL) return pLeft; else return pRoot;}int main(){ srand((unsigned)time(NULL)); fstream fin("tree.txt"); TreeNode *pRoot=NULL; TreeNode *pNodeOne=NULL; TreeNode *pNodeTwo=NULL; CreateBiTree(pRoot,fin,pNodeOne,pNodeTwo); cout<<"First Node is: "<
val<
val<
val<
你可能感兴趣的文章
远程协助,TeamViewer之外的另一种选择
查看>>
Centos 6.5 部署 LNMP
查看>>
网安天目
查看>>
rsync远程同步及rsync+inotify实时同步
查看>>
Redis分布式锁的正确实现方式(Java版)
查看>>
Linux20180427
查看>>
linux系统配置及服务管理第一章系统部署
查看>>
SQL语句优化:show参数
查看>>
webstorm那些常用快捷键
查看>>
MySQL5.7 group by新特性报错1055的解决办法
查看>>
网易企业邮箱的萨班斯归档是什么?
查看>>
阿里架构师告诉你最新Java架构师学习路线图
查看>>
飞天技术汇“2018云栖大会·重庆峰会”专场,“一出好戏”等你加入
查看>>
gamma勒索病毒成功解密处理经验方法教程邮箱catherwood.judd@aol.com
查看>>
PTGUI全景合成软件使用教程之补地拼接
查看>>
什么是架构?Untiy开发游戏使用什么架构合适?
查看>>
FTP传文件弊端多,更好用的解决方案来了!
查看>>
国内高校大数据工程教学实训平台解决方案
查看>>
金三银四,铜五铁六,我的面试通关秘籍(含HR)
查看>>
Kubernete-- 利用kubeadm 搭建一个kubernate集群
查看>>