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

来源:互联网 发布:淘宝商城玩具大全 编辑:程序博客网 时间:2024/06/13 21:09

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

代码如下

/** * 给出一棵二叉树的根节点以及其他两个不同节点,返回这两个不同节点的最近公共祖先节点 * @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++;elsebreak;}System.out.println(st1[t].getData());}


0 0