Java 二叉树一些基本操作

求二叉树中节点个数:

    /*1. 求二叉树中的节点个数
        递归解法:
        (1)如果二叉树为空,节点个数为0
        (2)如果二叉树不为空,二叉树节点个数 = 左子树节点个数 + 右子树节点个数 + 1
    */
    public int GetNodeNum(TreeNode root){
        if(root == null)
            return 0;
        return GetNodeNum(root.getLeft()) + GetNodeNum(root.getRight()) + 1;
    }

求二叉树的深度:

    /*2. 求二叉树的深度
        递归解法:
        (1)如果二叉树为空,二叉树的深度为0
        (2)如果二叉树不为空,二叉树的深度 = max(左子树深度, 右子树深度) + 1
    */
    public int GetDepth(TreeNode root){
        if(root == null)
            return 0;
        int left = GetDepth(root.getLeft());
        int right = GetDepth(root.getRight());
        return Math.max(left, right) + 1;
    }
    

二叉树广度遍历:

public void LevelTraverse(TreeNode root){
        //AbstractQueue queue = new AbstractQueue();
        Queue queue = new Queue();
        if(root == null)
            return;
        queue.Enqueue(root);
        while(queue.size != 0){
            TreeNode Node = queue.Dequeue();
            System.out.println(Node.getValue());
            if(Node.getLeft() != null){
                queue.Enqueue(Node.getLeft());
            }
            if(Node.getRight() != null){
                queue.Enqueue(Node.getRight());
            }    
        }
    }

判断一个二叉树是不是满二叉树:

/*
     * 判断一个二叉树是不是满二叉树
     */
    public boolean IsFullTree(TreeNode root){
        boolean flag = false;
        Queue queue = new Queue();
        if(root == null)
            return true;
        queue.Enqueue(root);
        while(queue.size != 0){
            TreeNode node = queue.Dequeue();
            if(flag == true){//flag = true表示已有节点左右子树为null
                if(node.getLeft() != null ||node.getRight() != null){
                    return false;
                }
                break;
            }
            else{
                //节点左右子树不为空,则左右节点入队
                if(node.getLeft() != null && node.getRight()!=null){
                    queue.Enqueue(node.getLeft());
                    queue.Enqueue(node.getRight());
                }
                //节点右子树为空,左节点入队
                else if(node.getLeft() != null && node.getRight() == null){
                    flag = true;
                    queue.Enqueue(node.getLeft());
                }//左节点为空,右子树不为空,直接返回FALSE
                else if(node.getLeft() == null && node.getRight() != null){
                    return false;
                    
                }
                else
                {//左右都为空,则为叶子节点
                    flag = true;
                }
            }
        }
        return true;
    }

判断二叉树B是不是A的子结构:

/*
     * 判断树root2是不是树root1的子结构
     */
    public boolean SubTree(TreeNode root1,TreeNode root2){
        boolean result = false;
        if(root1 != null && root2 != null){
            if(root1.getValue() == root2.getValue()){
                result = Dostree(root1,root2);
            }
            if(!result){
                result = SubTree(root1.getLeft(),root2);
            }
            if(!result){
                result = SubTree(root1.getRight(),root2);
            }
        }
        return result;
    }
    public boolean Dostree(TreeNode root1,TreeNode root2){
        if(root1 == null)
            return false;
        if(root2 == null)
            return false;
        if(root1.getValue() != root2.getValue())
            return false;
        return Dostree(root1.getLeft(),root2.getLeft()) && Dostree(root1.getRight(),root2.getRight());
    }

 

posted @ 2014-10-28 09:50  hfczgo  阅读(301)  评论(0编辑  收藏  举报