Java集合与数据结构——二叉树02

Posted RAIN 7

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java集合与数据结构——二叉树02相关的知识,希望对你有一定的参考价值。

文章目录

Java集合与数据结构——二叉树(二)初阶面试题


二叉树的前中后遍历


前序遍历

/**
 * Definition for a binary tree node.
 * public class TreeNode 
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() 
 *     TreeNode(int val)  this.val = val; 
 *     TreeNode(int val, TreeNode left, TreeNode right) 
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     
 * 
 */
class Solution 

    List<Integer> ret  = new ArrayList<>();

    public List<Integer> preorderTraversal(TreeNode root) 
         if(root == null)
             return ret;
         
          ret.add(root.val);
          preorderTraversal(root.left);
          preorderTraversal(root.right);
           
         return ret;
    


中序遍历

/**
 * Definition for a binary tree node.
 * public class TreeNode 
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() 
 *     TreeNode(int val)  this.val = val; 
 *     TreeNode(int val, TreeNode left, TreeNode right) 
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     
 * 
 */
class Solution 

    List<Integer> ret  = new ArrayList<>();

    public List<Integer> preorderTraversal(TreeNode root) 
    
         if(root == null)
             return ret;
         
        
          preorderTraversal(root.left);
          ret.add(root.val);
          preorderTraversal(root.right);
           
         return ret;
    


后序遍历

/**
 * Definition for a binary tree node.
 * public class TreeNode 
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() 
 *     TreeNode(int val)  this.val = val; 
 *     TreeNode(int val, TreeNode left, TreeNode right) 
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     
 * 
 */
class Solution 

    List<Integer> ret  = new ArrayList<>();

    public List<Integer> preorderTraversal(TreeNode root) 
    
         if(root == null)
             return ret;
         
        
          preorderTraversal(root.left);
          preorderTraversal(root.right);
          ret.add(root.val);
           
         return ret;
    


获取二叉树的高度



获取二叉树的最大深度

  public int gethigh(TreeNode root) 
  
        if (root == null) 
            return 0;
        

        int leftHeight = gethigh(root.left);
        int rightHeight = gethigh(root.right);

        return (Math.max(leftHeight, rightHeight))+1;
        
     // 可用三目操作符来进行比较
    //  return (leftHeight > rightHeight ? leftHeight + 1 : rightHeight + 1 )  ;

    

求整颗二叉树的叶子节点数量


遍历思路:

遍历二叉树的每一个节点,如果该节点的左子树和右子树 都为空,那么该节点就为叶子节点,我们要计算叶子节点的数量,定义一个 leafSize ,当节点符合叶子节点的要求时 leafSize ++.

    static int leafSize = 0;
    
    public void getleafSize(TreeNode root) 
     if(root == null)
         return; 
     
     if((root.left == null && root.right == null )
         leafSize++;
     
     
     getleafSize(root.left);
     getleafSize(root.right);
     
    

子问题思路:


我们将求二叉树的叶子节点数量这个问题,看成求 二叉树的 左子树的叶子节点 + 右子树的叶子节点

当 root == null 时 返回0

当 root.right == null && root.left == null 时,返回1

  public int getLeafSize2(TreeNode root) 
        
       if(root == null)
           return 0;
       
       
       if(root.right == null && root.left == null)
           return 1;
       
       
       return getLeafSize2(root.left)+getLeafSize2(root.right);
    

子问题思路:

求第K层 有多少个节点

k=3 时, root 为第一层,我们求第三层相当于求 root.left 的第二层+ root.right 的第二层

同理可得我们最后求的是

root.left.left 的第一层 + root.left.right 的第一层 + root.right.left 的第一层 + root.right.right 的第一层

我们只需要判断此时 k==1 时的节点 是否为空就可以得到第K层的节点,这同时也体现了递归的思路。

我们可以将返回值这样写

return getLevelSize(root.left,k-1) + getLevelSize (root.right,k-1)

 public int getLevelSize(TreeNode root,int k)
        if(root == null)
            return 0;
        
        if(k==1)
            return 1;
        

        return getLevelSize(root.left,k-1)+getLevelSize(root.right,k-1);

    

查找二叉树中 对应 val 值 的节点

不考虑重复节点!!!

    //  查找二叉树中 对应 val 值 的节点

    TreeNode find(TreeNode root , char val)
        if(root == null)
            return null;
        

        if(root.val == val)
            return root;
        

        TreeNode ret = find(root.left, val);

        if(ret != null)
            return ret;
        

        ret = find(root.right,val);

        if(ret != null)
            return ret;
        

        return null;

    

判断两颗二叉树是否相同

思路:

考虑 一个为空 一个不为空

两个都为空

两个都不为空时,值不一样

两个都不为空时,首个根的值是一样的

之后我们用递归来判断这两个根节点的左子树和右子树是否相同

/**
 * Definition for a binary tree node.
 * public class TreeNode 
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() 
 *     TreeNode(int val)  this.val = val; 
 *     TreeNode(int val, TreeNode left, TreeNode right) 
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     
 * 
 */
class Solution 
    public boolean isSameTree(TreeNode p, TreeNode q) 
        if(p != null && q == null)
            return false;
        
        
        if(p == null && q !=null)
            return false;
        

        if(p == null && q == null)
            return true;
        
        
        if(p.val != q.val)
            return false;
        

      
   return  isSameTree(p.left,q.left)  && isSameTree(p.right,q.right);

    


另一棵树的子树

我们来看一组树与子树

思路:

/**
 * Definition for a binary tree node.
 * public class TreeNode 
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() 
 *     TreeNode(int val)  this.val = val; 
 *     TreeNode(int val, TreeNode left, TreeNode right) 
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     
 * 
 */
class Solution 

public boolean isSameTree(TreeNode root, TreeNode subRoot)
    if(root == null && subRoot != null)
        return false;
    

     if(subRoot == null && root != null)
        return false;
    

    if(subRoot == null && root == null)
        return true;
    

    if(root.val != subRoot.val)
        return false;
    

    return isSameTree(root.left,subRoot.left) && isSameTree(root.right,subRoot.right);


    public boolean isSubtree(TreeNode root, TreeNode subRoot) 
       if(root == null || subRoot == null)
           return false;
       

       if(isSameTree(root,subRoot)== true)
           return true;
       

       if(isSubtree(root.left,subRoot)) return true;
       if(isSubtree(root.right,subRoot)) return true;

       return false;

    



判断平衡二叉树

什么是平衡二叉树呢?

这颗二叉树的每一个节点的左右子树的高度差绝对值不超过1

思路:

/**
 * Definition for a binary tree node.
 * public class TreeNode 
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() 
 *     TreeNode(int val)  this.val = val; 
 *     TreeNode(int val, TreeNode left, TreeNode right) 
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     
 * 
 */
class Solution 

 public int maxDepth(TreeNode root) 
  if (root == null) 
            return 0;
        

        int leftHeight = maxDepth(root.left);
        int rightHeight = maxDepth(root.right);

        return (Math.max(leftHeight, rightHeight))+1;

    

    public boolean isBalanced(TreeNode root) 
      if(root == null) return true;
      
      int rightHeight = maxDepth(root.right);
      int leftHeight  = maxDepth(root.left);

      return 
      Math.abs(rightHeight-leftHeight)<2 && isBalanced(root.left) && isBalanced(root.right);
      
      
    

上述的这种解法 时间复杂度太大了,遍历了每一个节点,在遍历节点的同时还要计算这个节点的深度,相当于右遍历了一遍,所以就是时间复杂度为 O(n^2)

时间复杂度太大了,我们换一种思路。

public int maxHeight(TreeNode root)
     if(root==null)
         return 0;
     

     int leftHeight = maxHeight(root.left);
     int rightHeight = maxHeight(root.right);
// 只要根的左树 或者右树 不满足,那么就会一直返回 -1,最后返回的就是一个负数,那么只要返回的不是正数就不是平衡二叉树

	if(leftHeight>=0 && rightHeight>=0 && Math.abs(leftHeight-rightHeight)<2)
    	return Math.max(leftHeight,rightHeight)+1;
	else
   		return -1;
	




    public boolean isBalanced(TreeNode root) 
		if(root==null)
    		return true;
		

		return maxHeight(root)>=0;

这种解法时间复杂度为 O(n).

这一篇就结束了,今天二叉树就讲到这里,希望大家多多练习,谢谢大家的阅读与欣赏…

二叉树03------进阶编程练习 敬请期待~~

以上是关于Java集合与数据结构——二叉树02的主要内容,如果未能解决你的问题,请参考以下文章

Java集合与数据结构 二叉树

Java集合与数据结构 二叉树

数据结构二叉树相关面试题 Java版 LeetCode题 ------- 二叉树

数据结构(java)之二叉树

OptimalSolution--二叉树问题子树与拓扑结构

数据结构-二叉树的存储结构与遍历