求二叉树的最近祖先(21.6.10)

题目描述:

已知一棵二叉树按顺序存储结构进行存储,设计一个算法,求编号分别为i和j的两个结点的最近的公共祖先结点的值。

算法思想:

要知道二叉树中任意两个结点必然存在最近的公共祖先结点,最坏的情况下是根结点(两个结点分别在根节点的左右分支中),而且从最近的公共祖先到根结点的全部祖先结点都是公共的。

由于二叉树的循序存储的特点,任一结点i的双亲结点的编号为i/2.求解i和j的最近的公共祖先的结点算法步骤如下(设从数组下标1开始存储):

1.若i>j,则结点i所在的层数大于等于j的层数,结点i的双亲结点为i/2.若i/2=j,则结点i/2是原结点i和结点j的最近公共祖先结点,若i/2!=j,则令i=i/2,即以该结点i的双亲结点为起点,采用递归的方法继续查找。
2.若j>i,则结点j所在的层数大于等于i的层数,结点j的双亲结点为j/2.若j/2=i,则结点j/2是原结点i和结点j的最近公共祖先结点,若j/2!=j,则令j=j/2。

重复上面的过程,直到找到最近的公共祖先结点为止。

代码如下:

ElemType Common_ancestor(SqTree T,int i,int j){
	if(T[i]!='#' && T[j]!='#'){  //结点存在 
		while(i!=j){  //两个编号不同时循环 
			if(i>j)
				i=i/2;
			else
				j=j/2;
		}
		return T[i];
	}
} 

你可能感兴趣的:(LeetCode,二叉树)