判断一棵树是否是完全二叉树和求二叉树中两个节点的最近公共祖先——题集(十三)

二叉树相关编程题总结 关于二叉树的五道面试题的总结 求二叉树的最远两个结点的距离; 由前序遍历和中序遍历重建二叉树; 判断一棵树是否是完全二叉树; 求二叉树两个节点的最近公共祖先; 将二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。 注:本篇博客就这五道面试题,并不是单纯的给出求解代码,而是全面的进行分析,并进行问题的延伸,在求解过程中对问题的延伸都有代码的实现,so! 阅读详情

判断一棵树是否是完全二叉树和求二叉树中两个节点的最近公共祖先——题集(十三)

       今天来分享一下,如何判断一棵树是否是完全二叉树和求二叉树中两个节点的最近公共祖先的代码实现和运行示例。

      首先分享判断一棵树是否是完全二叉树的源代码和运行示例。

       提示:层序遍历变型题。

源代码如下:

#include<iostream>
using namespace std;
#include<queue>

struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x)
		:val(x)
		,left(NULL)
		,right(NULL)
	{
    }
};

//判断一棵树是否是完全二叉树
bool IsCompleteBT(TreeNode* root){
	//递归层序遍历——队列
	//同一层前面结点没有孩子节点,后面也不可能有,设置标志位
	if(root==NULL) return true;//默认空树是完全二叉树
	bool flag=true;
	queue<TreeNode*> tmp;
	tmp.push(root);
	TreeNode* cur=NULL;

	while(!tmp.empty()){
		cur=tmp.front();
		tmp.pop();

		if(cur->left != NULL){
			if(flag)
			tmp.push(cur->left);
			else
				return false;
		}
		else
			flag=false;

		if(cur->right != NULL){
			if(flag)
			tmp.push(cur->right);
			else
				return false;
		}
		else
			flag=false;
	}
	return true;
}

void TestTree(){////判断一棵树是否是完全二叉树
	TreeNode * pRoot1=new TreeNode(1);
	TreeNode * pRoot2=new TreeNode(2);
	TreeNode * pRoot3=new TreeNode(3);
	TreeNode * pRoot4=new TreeNode(4);
	TreeNode * pRoot5=new TreeNode(5);
	TreeNode * pRoot6=new TreeNode(6);
	TreeNode * pRoot7=new TreeNode(7);
	TreeNode * pRoot8=new TreeNode(8);
	TreeNode * pRoot9=new TreeNode(9);

	cout<<"判断一棵树是否是完全二叉树"<<endl<<endl;
	pRoot1->right = pRoot3;
	cout<<"IsCompleteBT(pRoot1): "<<IsCompleteBT(pRoot1)<<endl;//判断一棵树是否是完全二叉树

	pRoot1->left = pRoot2;
	cout<<"IsCompleteBT(pRoot1): "<<IsCompleteBT(pRoot1)<<endl;

	pRoot3->left = pRoot6;
	pRoot3->right = pRoot7;
	cout<<"IsCompleteBT(pRoot1): "<<IsCompleteBT(pRoot1)<<endl;

	pRoot2->left = pRoot4;
	pRoot2->right = pRoot5;
	cout<<"IsCompleteBT(pRoot1): "<<IsCompleteBT(pRoot1)<<endl;
}

int main(){
	TestTree();////判断一棵树是否是完全二叉树
	
	system("pause");
	return 0;
}

运行结果:

 

       求二叉树中两个节点的最近公共祖先的源代码和运行示例。 

       要求考虑以下三种种情况,给出解决方案,并解决:

1:二叉树的每个节点有parent(三叉链)

源代码如下:

#include<iostream>
using namespace std;
#include<stack>

//求二叉树中两个节点的最近公共祖先
//1:二叉树每个节点有parent(三叉链) 
struct TreeNodeT {
    int _val;
    struct TreeNodeT * _parent;
    struct TreeNodeT * _left;
    struct TreeNodeT * _right;
    TreeNodeT(int x) :
            _val(x), _left(NULL), _right(NULL),_parent(NULL){
    }
};

TreeNodeT* LeastCommonAN1(TreeNodeT*  p1,TreeNodeT* p2){//求二叉树中两个节点的最近公共祖先——二叉树每个节点有parent
	if(p1==NULL) return p2;
	if(p2==NULL) return p1;
	if(p1->_val == p2->_val) return p1;
	stack<TreeNodeT*> tmp1;
	stack<TreeNodeT*> tmp2;
	TreeNodeT*  cur1=p1;
	TreeNodeT*  cur2=p2;

	while(cur1->_parent != NULL){
		if(cur1->_parent->_val  == p2->_val) return p2;
		cur1=cur1->_parent;
		tmp1.push(cur1);
	}

	while(cur2->_parent != NULL){
		if(cur2->_parent->_val  == p1->_val) return p1;
		cur2=cur2->_parent;
		tmp2.push(cur2);
	}
	TreeNodeT* root=NULL;
	while(!tmp1.empty() && !tmp2.empty()){
		if(tmp1.top()->_val == tmp2.top()->_val){
			root=tmp1.top();
		}
		else{
			return root;
		}

		tmp1.pop();
		tmp2.pop();
	}

	return NULL;
}

void TestT1(){//求二叉树中两个节点的最近公共祖先——二叉树每个节点有parent
	TreeNodeT * pRoot1=new TreeNodeT(1);
	TreeNodeT * pRoot2=new TreeNodeT(2);
	TreeNodeT * pRoot3=new TreeNodeT(3);
	TreeNodeT * pRoot4=new TreeNodeT(4);
	TreeNodeT * pRoot5=new TreeNodeT(5);
	TreeNodeT * pRoot6=new TreeNodeT(6);
	TreeNodeT * pRoot7=new TreeNodeT(7);
	TreeNodeT * pRoot8=new TreeNodeT(8);
	TreeNodeT * pRoot9=new TreeNodeT(9);

	pRoot1->_left = pRoot2;
	pRoot2->_parent = pRoot1;

	pRoot1->_right = pRoot3;
	pRoot3->_parent = pRoot1;

	pRoot2->_left = pRoot4;
	pRoot4->_parent = pRoot2;

	pRoot2->_right = pRoot5;
	pRoot5->_parent = pRoot2;

	pRoot3->_left = pRoot6;
	pRoot6->_parent = pRoot3;
	
	pRoot3->_right = pRoot7;
	pRoot7->_parent = pRoot3;
	
	pRoot4->_left = pRoot8;
	pRoot8->_parent = pRoot4;

	cout<<"求二叉树中两个节点的最近公共祖先——二叉树每个节点parent"<<endl<<endl;

	TreeNodeT* root= LeastCommonAN1(pRoot8,pRoot3);
	if(root!=NULL)
		cout<<"LeastCommonAN1(pRoot8,pRoot3): "<<root->_val<<endl;
	else
		cout<<"LeastCommonAN1(pRoot8,pRoot3): 不存在"<<endl;
	cout<<endl;

	root= LeastCommonAN1(pRoot4,pRoot6);
	if(root!=NULL)
		cout<<"LeastCommonAN1(pRoot4,pRoot6): "<<root->_val<<endl;
	else
		cout<<"LeastCommonAN1(pRoot4,pRoot6): 不存在"<<endl;
	cout<<endl;


	root= LeastCommonAN1(pRoot2,pRoot6);
	if(root!=NULL)
		cout<<"LeastCommonAN1(pRoot2,pRoot6): "<<root->_val<<endl;
	else
		cout<<"LeastCommonAN1(pRoot2,pRoot6): 不存在"<<endl;
	cout<<endl;


	root= LeastCommonAN1(pRoot8,pRoot2);
	if(root!=NULL)
		cout<<"LeastCommonAN1(pRoot8,pRoot2): "<<root->_val<<endl;
	else
		cout<<"LeastCommonAN1(pRoot8,pRoot2): 不存在"<<endl;
	cout<<endl;


	root= LeastCommonAN1(pRoot8,pRoot9);
	if(root!=NULL)
		cout<<"LeastCommonAN1(pRoot8,pRoot9): "<<root->_val<<endl;
	else
		cout<<"LeastCommonAN1(pRoot8,pRoot9): 不存在"<<endl;
	cout<<endl;

	root= LeastCommonAN1(pRoot1,pRoot9);
	if(root!=NULL)
		cout<<"LeastCommonAN1(pRoot1,pRoot9): "<<root->_val<<endl;
	else
		cout<<"LeastCommonAN1(pRoot1,pRoot9): 不存在"<<endl;
	cout<<endl;
}

int main(){
		TestT1();//求二叉树中两个节点的最近公共祖先——二叉树每个节点有parent
	
	system("pause");
	return 0;
}

运行结果:

 

2:二叉树是搜索二叉树。

源代码如下:

#include<iostream>
using namespace std;
#include<queue>

struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x)
		:val(x)
		,left(NULL)
		,right(NULL)
	{
    }
};

//2:二叉树是搜索二叉树。 它或者是一棵空树,或者是具有下列性质的二叉树:
//若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
//若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 
//它的左、右子树也分别为二叉排序树。
//中序遍历有序
bool IsAncent(TreeNode*  p1,TreeNode* p2){//判断p1是否是p2的祖先结点
	if(p1==NULL|| p2==NULL) return false;
	if(p1->val == p2->val) return true;
	else if(p1->val > p2->val){
		return  IsAncent(p1->left,p2);
	}
	else{
		return IsAncent(p1->right,p2);
	}
}

void _Find2(queue<TreeNode*>& tmp, TreeNode* root,TreeNode*  p){//得到从根到P结点的路径
	while(root!=NULL){
		if(root->val == p->val){
			break;
		}
		else if(root->val > p->val){
			tmp.push(root);
			root = root->left;
		}
		else{
			tmp.push(root);
			root = root->right;
		}
	}
}

TreeNode* LeastCommonAN2(TreeNode*  root,TreeNode*  p1,TreeNode* p2){//求二叉树中两个节点的最近公共祖先——二叉树是搜索二叉树
	if(root==NULL) return root;
	if(p1==NULL) return p2;
	if(p2==NULL) return p1;
	if(IsAncent(p1,p2)) return p1;//判断p1是否是p2的祖先结点
	if(IsAncent(p2,p1)) return p2;//判断p2是否是p1的祖先结点

	queue<TreeNode*> tmp1;
	TreeNode* cur=root;
	_Find2( tmp1, cur, p1);//得到从根到P1结点的路径
	if(cur==NULL) return NULL;//p1不在该树中

	queue<TreeNode*> tmp2;
	cur=root;
	_Find2( tmp2, cur, p2);//得到从根到P2结点的路径
	if(cur==NULL) return NULL;//p2不在该树中

	TreeNode* aim=NULL;

	while(!tmp1.empty() && !tmp2.empty()){
		if(tmp1.front()->val == tmp2.front()->val){
			aim=tmp1.front();
		}
		else{
			return aim;
		}

		tmp1.pop();
		tmp2.pop();
	}

	return aim;
}

void TestT2(){//求二叉树中两个节点的最近公共祖先——二叉树是搜索二叉树
	TreeNode * root0=new TreeNode(8);
	TreeNode * root1=new TreeNode(5);
	TreeNode * root2=new TreeNode(14);
	TreeNode * root3=new TreeNode(2);
	TreeNode * root4=new TreeNode(6);
	TreeNode * root5=new TreeNode(18);

	root0->left = root1;
	root0->right = root2;
	root1->left = root3;
	root1->right = root4;
	root2->right = root5;


	cout<<"求二叉树中两个节点的最近公共祖先——二叉树是搜索二叉树"<<endl<<endl;
	TreeNode* root= LeastCommonAN2(root0,root4, root3);
	if(root!=NULL)
		cout<<"LeastCommonAN2(root0,root4, root3): "<<root->val<<endl;
	else
		cout<<"LeastCommonAN2(root0,root4, root3): 不存在"<<endl;
	cout<<endl;

	root= LeastCommonAN2(root0,root4,root5);
	if(root!=NULL)
		cout<<"LeastCommonAN2(root0,root4, root5): "<<root->val<<endl;
	else
		cout<<"LeastCommonAN2(root0,root4, root5): 不存在"<<endl;
	cout<<endl;

	root= LeastCommonAN2(root0,root2,root5);
	if(root!=NULL)
		cout<<"LeastCommonAN2(root0,root2, root5): "<<root->val<<endl;
	else
		cout<<"LeastCommonAN2(root0,root2, root5): 不存在"<<endl;
	cout<<endl;
}

int main(){
	TestT2();//求二叉树中两个节点的最近公共祖先——二叉树是搜索二叉树
	
	system("pause");
	return 0;
}

运行结果:

 

3:就是普通二叉树。(尽可能实现时间复杂度为O(N))

源代码如下:

#include<iostream>
using namespace std;
#include<stack>

struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x)
		:val(x)
		,left(NULL)
		,right(NULL)
	{
    }
};

//3:就是普通二叉树。
void _Find3(stack<TreeNode*>& tmp, TreeNode*  root,TreeNode*  p){//得到从根到P1结点的路径
	TreeNode* cur=root;
	TreeNode* prev=NULL;
	while(cur!=NULL || !tmp.empty()){//后序
		while(cur && cur != prev){
			tmp.push(cur);
			if(cur->val == p->val){
				return ;
			}
			cur=cur->left;
		}


		if(tmp.top()->right == prev || tmp.top()->right == NULL)
		 {
			prev = tmp.top();
			tmp.pop();
		}
		if(!tmp.empty())
		cur=tmp.top()->right;
		else
			break;
	}
	return ;
}

//把以p1和p2的路径求出来找相同即可,不分是否以p1和p2为公共结点
TreeNode* LeastCommonAN3(TreeNode*  root,TreeNode*  p1,TreeNode* p2){
	if(root==NULL) return root;
	TreeNode* cur=root;

	stack<TreeNode*> tmp1;
	_Find3(tmp1, cur,p1);//得到从根到P1结点的路径

	stack<TreeNode*> tmp2;
	cur=root;
	_Find3(tmp2, cur,p2);//得到从根到P1结点的路径

	TreeNode* aim=NULL;

	while(!tmp1.empty() && !tmp2.empty()){
			while(tmp1.size()!= tmp2.size()){
				if(tmp1.size()> tmp2.size())
					tmp1.pop();
				else
					tmp2.pop();
			}
		//找到第一个相似结点
			if(tmp1.top()->val == tmp2.top()->val){
				aim=tmp1.top();
				return aim;
			}

			tmp1.pop();
			tmp2.pop();
	}

		return aim;
}

void TestTree3(){//求二叉树中两个节点的最近公共祖先——二叉树是普通二叉树
	TreeNode * pRoot1=new TreeNode(1);
	TreeNode * pRoot2=new TreeNode(2);
	TreeNode * pRoot3=new TreeNode(3);
	TreeNode * pRoot4=new TreeNode(4);
	TreeNode * pRoot5=new TreeNode(5);
	TreeNode * pRoot7=new TreeNode(7);
	TreeNode * pRoot8=new TreeNode(8);
	TreeNode * pRoot9=new TreeNode(9);

	pRoot1->left = pRoot2;
	pRoot1->right = pRoot3;
	pRoot2->left = pRoot4;
	pRoot2->right = pRoot5;
	pRoot3->right = pRoot7;
	pRoot4->left = pRoot8;

	cout<<"求二叉树中两个节点的最近公共祖先——普通二叉树"<<endl<<endl;
	TreeNode* root= LeastCommonAN3(pRoot1,pRoot8,pRoot3);
	if(root!=NULL)
		cout<<"LeastCommonAN3(pRoot1,pRoot8,pRoot3): "<<root->val<<endl;
	else
		cout<<"LeastCommonAN3(pRoot1,pRoot8,pRoot3): 不存在"<<endl;
	cout<<endl;

	
	root= LeastCommonAN3(pRoot1,pRoot9,pRoot3);
	if(root!=NULL)
		cout<<"LeastCommonAN3(pRoot1,pRoot9,pRoot3): "<<root->val<<endl;
	else
		cout<<"LeastCommonAN3(pRoot1,pRoot9,pRoot3): 不存在"<<endl;
	cout<<endl;

	root= LeastCommonAN3(pRoot1,pRoot4,pRoot7);
	if(root!=NULL)
		cout<<"LeastCommonAN3(pRoot1,pRoot4,pRoot7): "<<root->val<<endl;
	else
		cout<<"LeastCommonAN3(pRoot1,pRoot4,pRoot7): 不存在"<<endl;
	cout<<endl;


	root=LeastCommonAN3(pRoot1,pRoot8,pRoot5);
	if(root!=NULL)
		cout<<"LeastCommonAN3(pRoot1,pRoot8,pRoot5): "<<root->val<<endl;
	else
		cout<<"LeastCommonAN3(pRoot1,pRoot8,pRoot5): 不存在"<<endl;
	cout<<endl;


	root= LeastCommonAN3(pRoot1,pRoot8,pRoot9);
	if(root!=NULL)
		cout<<"LeastCommonAN3(pRoot1,pRoot8,pRoot9): "<<root->val<<endl;
	else
		cout<<"LeastCommonAN3(pRoot1,pRoot8,pRoot9): 不存在"<<endl;
	cout<<endl;


	root= LeastCommonAN3(pRoot1,pRoot1,pRoot7);
	if(root!=NULL)
		cout<<"LeastCommonAN3(pRoot1,pRoot1,pRoot7): "<<root->val<<endl;
	else
		cout<<"LeastCommonAN3(pRoot1,pRoot1,pRoot7): 不存在"<<endl;
	cout<<endl;
}

int main(){
		TestTree3();//求二叉树中两个节点的最近公共祖先——二叉树是普通二叉树
	
	system("pause");
	return 0;
}

运行结果:

 

分享如上,如有错误,望斧正!愿大家学得开心,共同进步!

二叉树的五道面试题 1、判断一棵树是否是完全二叉树; 2、求二叉树中最远两个结点的距离; 3、由前序和中序遍历序列重建二叉树 (前序序列:1 2 3 4 5 6 - 中序序列:3 2 4 1 6 5); 4、求二叉树两个结点的最近公共祖先; 5、将二叉搜索树转化成有序的双向链表; 判断一棵树是否是完全二叉树 要想判断一颗树是否是完全二叉树,你得先知道什么是完全二叉树。 完全二 阅读详情

相关推荐

【数据结构】二叉树面试题总结

为了对二叉树的知识进行巩固,今天我们来解析5道二叉树的经典面试题。 这五道面试题如下: 求二叉树中最远两个结点的距离; 判断一棵树是否是完全二叉树; 由前序和中序遍历序列重建二叉树 (前序序列:1 2 3 4 5 6 - 中序序列:3 2 4 1 6 5); 求二叉树两个结点的最近公共祖先; 将二叉搜索树转化成有序的双向链表;现在我们来对这五道题进行分析: 求二叉树中最远的两个节点之间的距离这

leap的博客 2893

【数据结构】二叉树篇|超清晰图解和详解:二叉树的最近公共祖先

首先要明白,当root为p,q的最近祖先节点,只有下面3种情况: 1. p,q在root分别存在于root的左右子树中(异侧)——>root即为最近祖先节点 2. p, q均在root的左侧——>p/q即为最近祖先节点 3. p, q均在root的右侧——>同理

Yaoyao2024的博客 5720

Java实现二叉树最近公共祖先问题

在树形数据结构中,最近公共祖先(LCA)是连接两个节点的路径上的最低节点,这个节点是两个节点的共同祖先,同时也是最近的那一个。LCA的概念在树结构的路径查询、网络设计、分布式系统以及一些图形用户界面(GUI)应用中尤为重要。最近公共祖先的概念允许我们快速查询树中节点间的关系。例如,在GUI中,可以确定窗口和它们的共同父级,或者在文件系统中,确定两个文件夹的最近共同父文件夹。树结构中找到LCA可以帮助我们更高效地解决问题,如查询两个节点的最小距离、判断一个节点是否是另一个节点的子树的一部分等。

weixin_36311421的博客 996

数据结构关于链表的代码如下

//注意:该文件操作的单链表为带头结点单链表,头结点数据为-1#include &lt;stdio.h&gt;#include &lt;stdlib.h&gt;#include &lt;time.h&gt;#define OK 1#define ERROR 0typedef int ;typedef struct Node{ data_t data; struct Node *next;}Nod...

hash_world的博客 456

二叉树最近最近公共祖先

Java语言,通过栈的方法建立二叉树,递归求最近共同祖先结点

uniapp串口通信实战:从零搭建物联网设备控制App(附完整代码)

本文详细介绍了如何使用Uniapp实现串口通信,从零搭建物联网设备控制App。内容涵盖环境配置、串口初始化、数据收发、错误处理等核心功能,并提供了完整的代码示例,帮助开发者快速掌握跨平台串口通信技术,适用于智能农业、工业自动化等物联网场景。

weixin_30369041的博客 597

c 语言 1165实数的小数部分 指针专题

/***** 题目描述 读入一个实数,输出该实数的小数部分,小数部分若多余的末尾0,请去掉。如输入111111.12345678912345678900 则输出0.123456789123456789。若去掉末尾0之后小数部分为0,则输出“No decimal part”。注意该实数的位数不超过100位。 请定义并使用如下函数。 char *decimal(char *p) { 将字符串p表示的实...

qq_39345244的博客 965

《小白入门:无人机电调 ESC 的 PWM 接口特性、主流协议与使用指南》

电调是无人机的 “动力中枢”,其 PWM 接口是入门的基础,而 SBUS、DroneCAN 等协议则代表了更高阶的控制方式。小白学习时,需先掌握 PWM 的基本特性和连接方法,再根据场景选择合适的协议,同时严格遵守使用注意事项(如电源匹配、校准步骤、安全操作)。随着实践深入,逐步理解 “协议差异” 和 “系统协同”,才能让无人机更稳定、安全地飞行。

bother3000的博客 3769

数据结构与算法---二叉树---二叉树的最近公共祖先、恢复二叉搜索树

二叉树的绝大部分题目都可以直接通过递归+遍历解决 以下,必须掌握: 树的高度-递归 前中后序遍历 层序遍历 翻转二叉树 二叉树的最近公共祖先 236. 二叉树的最近公共祖先 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。” 例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,

IOSSHAN的博客 420

OpenWrt kmod内核不兼容?手把手教你用脚本强制安装驱动模块(附国内镜像源)

本文详细解决了OpenWrt kmod内核不兼容问题,提供智能脚本强制安装驱动模块的方法,并附有国内镜像源加速配置。通过自动化脚本修改内核MD5校验值,确保kmod包正常安装,同时推荐多个国内镜像源以提升下载速度。

weixin_42549451的博客 542

保姆级教程:用Altium Designer 24从零画一块PCB(附完整库文件与避坑清单)

本文提供了一份详细的Altium Designer 24(AD24)PCB设计教程,从工程创建到最终文件输出,涵盖元件库管理、原理图设计、PCB布局布线等全流程。特别适合初学者,包含STM32最小系统板的实战案例,附完整库文件和避坑清单,帮助用户快速掌握AD24的核心功能与技巧。

weixin_27697385的博客 249

二叉树的公共祖先

本文首先会介绍什么是最近公共祖先,接着将会针对该问题介绍几种求解方法,也是本文的核心内容。

weixin_54383080的博客 2706

航天设备研制中的形态分类:电性件、正样件及其他关键形态详解

航天设备的研制是一个高度复杂且严谨的工程过程,涉及多个阶段的不同产品形态。这些形态各具特点,在研制流程中承担着不同的验证任务和工程目标。本文将系统介绍航天设备研制中的主要形态,包括**电性件(EM)**、**正样件(FM)**以及**结构热控件(STM)**、**鉴定件(QM)**和**初样件(PFM)**等,详细解析它们的定义、用途和工程意义,帮助读者全面理解航天产品从设计到飞行的全生命周期管理。

ScilogyHunter的博客 1661

力扣236——二叉树的最近公共祖先

祝大家新年快乐呀,虽这段时间正值过年,但是我们不要忘记停下学习的脚步。今天我们一起看一到力扣上的经典二叉树OJ题,求二叉树两个结点最近的公共祖先。链接给大家放在这里啦,大家一点即达首先我们看到题目,这道题并没有告诉我们这是一棵怎么样的二叉树,不是完全二叉,也不是搜索二叉,所以这道题做起来就比较棘手,完全二叉树的话我们可以根据结点的编号查找,搜索二叉我们也可以按照大小确定范围,但是眼前这颗数完全是一个乱序的,所以这道题怎么下手呢?

weixin_67131528的博客 1156

2025华为OD机试真题目录汇总 B+C+D+E卷(570道)(Python语言)

本文是华为OD机试真题(Python 语言)专栏的目录贴(持续更新中…)华为OD是Outsourcing Dispacth模式,是华为和外企德科联合招聘的简称。目前华为大多数是OD招聘。OD模式也是华为提出的一种新的用工形式,每年都会从OD项目挑优秀员工转为正编。所有OD和正式员工一样对待,没有差别,部门平时开会、评审等活动都是一起参加的,是同薪同酬,都是由华为的HR直接定的薪资,看的是我们技术能力。华为是大企业,能到华为上班也是有能力的,每个部门都有好多职位,是金子,在哪都会发光。

KJ.JK 18万+

反应动力学仿真软件:ChemkinPro_(11).敏感性分析

敏感性分析是化学反应动力学仿真中的一项重要技术,通过对模型参数的变化对模型输出的影响进行评估,可以帮助研究人员优化模型、验证实验数据和评估不确定性。ChemkinPro 提供了强大的敏感性分析功能,可以方便地进行参数选择、仿真设置和结果解读。通过实际案例研究,我们可以看到敏感性分析在燃烧、催化和环境化学等领域的广泛应用,为科学研究和工程应用提供了有力支持。

kkchenjj的博客 1309

求二叉树两个结点的最近公共祖先

题目描述: 一颗二叉树按顺序存储结构进行存储,设计一个算法,求编号i和j的最近公共祖先 思路: 已知:二叉树、顺序存储 空的结点用“#”表示 如果i,j所在位置的结点数据不是“#”,才有公共结点; 若i<j,则j和i可能在同一层,或者比i的层数高,找j的双亲结点,j/2,再重复进行比较; 若i>j,则i和j可能在同一层,或者比j的层数高,找i的双亲结点,i/2,再重复进行比较; 直到i...

韩豆豆小姐的博客 1709

使用Python爬虫抓取政府网站政务信息:公告、通知的自动化抓取与分析

通过结合Requests、BeautifulSoup、Selenium等技术,你能够高效地抓取政府网站的数据,并通过MySQL存储与Pandas分析这些数据。通过自动化手段抓取这些信息,不仅可以提高数据收集的效率,还能够实时获取最新的政务动态,为政策研究、舆情分析等提供宝贵数据。我们将通过Python的Requests、BeautifulSoup、Selenium等工具,结合最新的技术实现一个完整的爬虫系统,帮助你轻松抓取并分析政务信息。通过爬虫,我们可以自动化地从指定网站上抓取公告、新闻、通知等信息。

2201_76125261的博客 1907

CSU - 1213 二叉树结点公共祖先 && 51Nod - 2599 最近公共祖先(LCA)

51Nod - 2599 最近公共祖先(LCA)https://vjudge.net/problem/51Nod-2599 LCA(Lowest Common Ancestors),即最近公共祖先,是指在有根树中,找出某两个节点u和v最近的公共祖先。(若u为v的祖先或者v为u的祖先,则LCA(u,v)就是作为祖先的那个节点) 现在有一棵以1为根的有根树,树上一共有n个节点。现在有m次查询,...

一定要站在自己热爱的生活里闪闪发光 3万+

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

寻找二叉树中两个结点的最近公共祖先

Node* FindNode(Node*root,Node*p) { if (root == NULL) return NULL; if (root == p) return root; if (FindNode(root->left, p)) return FindNode(root->left, p); return FindNode(root->righ...

不积极分子 1724

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

LeetCode算法小抄-- 最近公共祖先 和 完全二叉树的节点个数

LeetCode算法小抄-- 最近公共祖先 和 完全二叉树的节点个数

需要远程指导仿真实验、代码有问题的,请后台私信或者关注公众号 738

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

算法-二叉树的最近公共祖先

算法-二叉树的最近公共祖先二叉树的最近公共祖先 二叉树的最近公共祖先 236. 二叉树的最近公共祖先 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。” 例如,给定如下二叉树: root = [3...

qq_23594799的博客 721

十九、二叉树的最近的公共祖先

十九、二叉树的最近的公共祖先 文章目录十九、二叉树的最近的公共祖先题目描述解题思路上机代码: 题目描述 设顺序存储的二叉树中有编号为 i 和 j 的两个结点,请设计算法求出它们最近的公共祖先结点的编号和值。 输入: ​ 输入第1行给出正整数n(≤1000),即顺序存储的最大容量; 第2行给出n个非负整数,其间以空格分隔。其中0代表二叉树中的空结点(如果第1个结点为0,则代表一棵空树); 第3行给出一对结点编号 i 和 j 。 题目保证输入正确对应一棵二叉树,且1≤ i,j ≤n。 输出: 如果i或j对应的是

qq_42582489的博客 640

python coding with ChatGPT 打卡第21天| 二叉树:最近公共祖先

二叉树的最近公共祖先

baidu_33000721的博客 1470

【牛客网面试必刷TOP101】二叉树篇(二)

二叉树是数据结构中重要的一个章节,他的重要性也不言而喻,在未来不管是笔试还是面试都会遇到这类的题目,所以接下来我就会把一些常考的题目全部整理出来供大家学习指正。

qq_66314292的博客 1975

求完全二叉树中的最近公共祖先(数组形式存放节点)

完全二叉树的最近公共祖先 题目描述 完全二叉树采用数组存放,在数组中找到v1和v2的最近公共祖先 思路 将数组的索引当做二叉树的节点,当前节点为root,其左子树为left = root * 2 + 1;右子树为 right = left + 1;, 递归三部曲 返回值和参数:输入当前的数组以及起始点root = 0,两个节点值v1和v2,输出v1和v2的最近公共祖先 单层递归逻辑:当前节点等于v1或者v2时返回当前节点,当前节点不为v1或者v2,遍历它的左子树和右子树,如果左子树返回-1,说明v1和v2

Lc_summer的博客 1647
上一篇: 判断一个节点是否在一棵二叉树中和判断一颗二叉树是否是另一颗树的子树——题集(十二)
下一篇: 由前序遍历和中序遍历重建二叉树和C语言模式实现C++继承和多态——题集(十四)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值