给出一棵二叉树的根节点和其中两个不同的节点求出它们最近的公共祖先节点

如题,这是一个很老的问题,我们采用类似后序遍历的方式,在找到一个节点后保存栈中的节点,已得到一条从根节点到当前节点的路径

代码如下

/**
	 * 给出一棵二叉树的根节点以及其他两个不同节点,返回这两个不同节点的最近公共祖先节点
	 * @param n1,n2,root
	 */
	public static void getClosetAncestor(BTNode root,int n1,int n2){
		BTNode[] st=new BTNode[255];
		BTNode p=root;
		int k=0;
		int flag=0;
		BTNode pre=null;
		BTNode[] st1=new BTNode[255];//用来存放n1节点的祖先节点
		int k1=0;
		BTNode[] st2=new BTNode[255];//用来存放n2节点的祖先节点
		int k2=0;
		if(p!=null){
			st[k++]=p;
			p=p.getLeft();
			while(k>0){
				while(p!=null){
					st[k++]=p;
					p=p.getLeft();
				}
				flag=1;
				pre=null;
				while(flag==1&&k>0){
					p=st[k-1];
					if(p.getRight()==pre){
						k--;
						if(p.getData()==n1){
							for(int i=0;i<k;i++){
								st1[k1++]=st[i];
							}
						}
						if(p.getData()==n2){
							for(int i=0;i<k;i++){
								st2[k2++]=st[i];
							}
						}
						pre=p;
					}
					else{
						p=p.getRight();
						flag=0;
					}
					
				}
			}
		}
		int t=0;
		while(t<k1-1&&t<k2-1){
			if((st1[t].getData()==st2[t].getData())&&(st1[t+1].getData()==st2[t+1].getData()))
				t++;
			else
				break;
		}
		System.out.println(st1[t].getData());
	}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值