Java算法系列12 — 求一棵二叉树的最大子树和

实现思路:
利用二叉树的后序遍历,遍历的结点的值与其左右子树和的值相加的结果大于最大值,则更新最大值。

代码实现:

/**
     * 构造二叉树
     * @return 返回新构造的二叉树的根节点
     */
    public static BITNode constructTree(){
        BITNode root = new BITNode();
        BITNode node1 = new BITNode();
        BITNode node2 = new BITNode();
        BITNode node3 = new BITNode();
        BITNode node4 = new BITNode();
        root.data = 6;
        node1.data = 3;
        node2.data = 7;
        node3.data = 1;
        node4.data = 9;
        root.lchild = node1;
        root.rchild = node2;
        node1.lchild = node3;
        node1.rchild = node4;
        node2.lchild = node2.rchild = node3.lchild = node3.rchild = node4.lchild = node4.rchild = null;
        return root;
    }
/**
     * 求最大子树
     * @param root 根节点
     * @param maxRoot 最大子树的根节点
     * @return 以root为根节点子树所有结点的和
     */
    public static int findMaxSubTree(BITNode root,BITNode maxRoot){
        if(root == null){
            return 0;
        }
        //求root左子树所有结点的和
        int lMax = findMaxSubTree(root.lchild,maxRoot);
        //求root右子树所有结点的和
        int rMax = findMaxSubTree(root.rchild,maxRoot);
        int sum = lMax + rMax + root.data;
        //以root为根的子树的和大于前面求出的的最大值
        if(sum > maxSum){
            maxSum = sum;
            maxRoot.data = root.data;
        }
        return sum;
    }

测试:

public static void main(String[] args) {
        BITNode root = constructTree();
        BITNode maxRoot = new BITNode();
        findMaxSubTree(root,maxRoot);
        System.out.println("最大子树和为:"+maxSum);
        System.out.println("对应子树根节点为:"+maxRoot.data);
    }

你可能感兴趣的:(java)