zoukankan      html  css  js  c++  java
  • 【数据结构】二叉树的堂兄弟 Cousins in Binary Tree

    二叉树的堂兄弟 Cousins in Binary Tree

    在二叉树中,根节点位于深度 0 处,每个深度为 k 的节点的子节点位于深度 k+1 处。

    如果二叉树的两个节点深度相同,但 父节点不同 ,则它们是一对堂兄弟节点。

    我们给出了具有唯一值的二叉树的根节点 root ,以及树中两个不同节点的值 x 和 y 。

    只有与值 x 和 y 对应的节点是堂兄弟节点时,才返回 true 。否则,返回 false。

    思路

    按照题目的要求,需要计算2个节点的深度,如果深度一样,就比较父节点是否是同一个节点。

    原始的做法:

    设定一个方法计算节点的深度。

    设定一个方法计算节点的父节点。

    public boolean isCousins(TreeNode root, int x, int y) {
    	if(root==null){
    		return false;
    	}
    	int xdepth = getdepth(root, x,0);
    	int ydepth = getdepth(root, y,0);
         
    	if(xdepth!=ydepth){
    		return false;
    	}
    	TreeNode p = findxparent(root,x);
    	TreeNode q = findxparent(root,y);
    	return !(p.val==q.val);
    }
    
    public TreeNode findxparent(TreeNode root, int x){
    	if(root==null){
    		return null;
    	}
    
        TreeNode t=null;
    	System.out.println("root 1 "+root.val);
    	if(root.left!=null){
    		if(root.left.val==x){
    			return root;
    		}
    		else{
    			t = findxparent(root.left,x);
    		}
    	}
    	if(t!=null){
            return t;
        }
    	
    	if(root.right!=null){
    		if(root.right.val==x){
    			return root;
    		}
    		else{
    			t = findxparent(root.right,x);
    		}
    	}
    	return t;
    }
    
    public int getdepth(TreeNode root, int x,int depth){
    	if(root==null){
    		return -1;
    	}
    	if(root.val==x){
    		return depth;
    	}
    	depth +=1;
    	int left = getdepth(root.left,x,depth);
    	if(left>0){
    		return left;
    	}
    	
    	int right = getdepth(root.right,x,depth);
    	if(right>0){
    		return right;
    	}
    	return 0;
    }
    

    DFS在求节点的深度的同时,保存节点的父节点信息

    public boolean isCousins(TreeNode root, int x, int y) {
    	if(root==null){
    		return false;
    	}
        TreeNode[] xparent =new TreeNode[1];
    	TreeNode[] yparent =new TreeNode[1];
    	int xdepth = getdepth(root, x,xparent);
    	int ydepth = getdepth(root, y,yparent);
    	return xdepth==ydepth&& xparent[0]!=yparent[0] ;
    }
     
    
    public int getdepth(TreeNode root, int x,TreeNode[] parent){
    	if(root==null){
    		return -1;
    	}
    	if(root.val==x){
    		return 0;
    	}
    	parent[0] =root;
    	int res=0;
    	
    	res = getdepth(root.left,x,parent);
    	if(res!=-1){
    		return res+1;
    	}
    	parent[0] =root;
    	res = getdepth(root.right,x,parent);
    	if(res!=-1){
    		return res+1;
    	}
    	return -1;
    }
    

    使用BFS遍历的过程中保存节点的深度和父节点信息。需要额外的数据结构,来保存信息。

    public class Data{
            int depth;
            TreeNode father;
            TreeNode node;
            Data(TreeNode n,TreeNode f,int d){
                depth =d;
                father =f ;
                node =n;
            }
        }
    
    public boolean isCousins(TreeNode root, int x, int y) {
    	if(root==null){
    		return false;
    	}
    	int dx =-1;
    	int dy =-1;
    	TreeNode xfather =null;
    	TreeNode yfather =null;
    	Queue<Data> queue = new LinkedList<Data>();
    	Data data = new Data(root,null,0);
    	queue.offer(data);
    	
    	while(!queue.isEmpty()){
    		Data t = queue.peek();
    		TreeNode cur = t.node;
    		if(cur.val==x){
    			dx = t.depth;
    			xfather = t.father;
    		}
    		if(cur.val==y){
    			dy = t.depth;
    			yfather = t.father;
    		}
    		
    		if(cur.left!=null){
    			queue.offer(new Data(cur.left,cur,t.depth+1));
    		}
    		if(cur.right!=null){
    			queue.offer(new Data(cur.right,cur,t.depth+1));
    		}
    		queue.poll(); 
    	}
    	return dx==dy && xfather!=yfather ;	 
    }
    

    Tag

    DFSBFS

  • 相关阅读:
    Samba 4.0 RC3 发布
    SymmetricDS 3.1.7 发布,数据同步和复制
    Express.js 3.0 发布,Node.js 的高性能封装
    GIFLIB 5.0.1 发布,C语言的GIF处理库
    jQuery UI 1.9.1 发布
    SVN Access Manager 0.5.5.14 发布 SVN 管理工具
    DynamicReports 3.0.3 发布 Java 报表工具
    HttpComponents HttpClient 4.2.2 GA 发布
    AppCan 2.0 正式发布,推移动应用云服务
    Ruby 2.0 的新功能已经冻结
  • 原文地址:https://www.cnblogs.com/dreamtaker/p/15368032.html
Copyright © 2011-2022 走看看