二叉樹下

寫在前面:上午看了星爺的新喜劇之王,由於之前感覺評分不高導致並沒有上映就看的!看完覺得真的沒有感到有多差,起碼我是這樣認爲的!
  1. 輸入一棵二叉樹,判斷該二叉樹是否是平衡二叉樹
package tree;

import java.util.HashMap;

/**
 * Create by IDEA
 * User: zhangqi
 * Date: 2019/3/28
 * Desc: 輸入一棵二叉樹,判斷該二叉樹是否是平衡二叉樹
 */
public class BalanceTree {
    /**
     * 思路a:寫一個方法遞歸遍歷二叉樹左右結點的深度,並判斷深度差 如果大於1則不是平衡二叉樹
     * @param root
     * @return
     */
    public boolean IsBalanced(TreeNode root) {
        HashMap<Integer, Boolean> map = new HashMap<>();
        map.put(1, true);
        depth(root, map);
        return map.get(1);
    }

    public int depth(TreeNode root, HashMap<Integer,Boolean> map){

        if (root == null) return 0;
        int left = depth(root.left,map);
        int right = depth(root.right,map);
        if(left-right>1 || right-left>1) map.put(1,false);
        return Math.max(left, right) + 1;
    }
}

  1. 輸入一棵二叉樹,求該樹的深度
package tree;

import java.util.HashMap;
import java.util.LinkedList;
import java.util.Queue;

/**
 * Create by IDEA
 * User: zhangqi
 * Date: 2019/3/27
 * Desc: 輸入一棵二叉樹,求該樹的深度
 */
public class TreeDepth {

    /**
     * 思路a:對二叉樹進行層序遍歷得出樹的深度
     *
     * @param root
     * @return
     */
    public int treeDepth(TreeNode root) {
        HashMap<Integer, Boolean> map = new HashMap<>();
        map.put(1, true);
        if (root == null) return 0;
        Queue<TreeNode> queue = new LinkedList<>();
        int deep = 0;
        int cur, width;
        queue.offer(root);
        while (!queue.isEmpty()) {
            width = queue.size();
            cur = 0;
            while (cur < width) {
                TreeNode node = queue.poll();
                if (node.left != null) queue.offer(node.left);
                if (node.right != null) queue.offer(node.right);
                cur++;
            }
            deep++;
        }
        return deep;
    }

    /**
     * 思路b:遞歸版本,不看答案很難想的出來
     * @param root
     * @return
     */
    public int treeDepth2(TreeNode root) {

        if (root == null) return 0;

        int left = treeDepth2(root.left);
        int right = treeDepth2(root.right);

        return Math.max(left, right) + 1;
    }


}

  1. 輸入一棵二叉搜索樹,將該二叉搜索樹轉換成一個排序的雙向鏈表。要求不能創建任何新的結點,只能調整樹中結點指針的指向
package tree;

import java.util.Stack;

/**
 * Create by IDEA
 * User: zhangqi
 * Date: 2019/3/28
 * Desc: 輸入一棵二叉搜索樹,將該二叉搜索樹轉換成一個排序的雙向鏈表。要求不能創建任何新的結點,只能調整樹中結點指針的指向。
 */
public class TreeToList {

    /**
     * 思路a:二叉搜索樹也就是二叉查找樹,左子樹小於右子樹,要求排序所以選擇中序遍歷
     *
     * @param root
     * @return
     */
    public TreeNode treeToList(TreeNode root) {

        if (root == null) return null;
        Stack<TreeNode> stack = new Stack<>();
        TreeNode p = root;
        TreeNode pre = null; //保存上一結點
        boolean isFirst = true;
        while (p != null || !stack.isEmpty()) {
            while (p != null) {
                stack.push(p);
                p = p.left;
            }
            p = stack.pop();
            if (isFirst) {
                root = p; //將起點賦予中序遍歷的第一個
                pre = p;
                isFirst = false;
            } else {
                pre.right = p;
                p.left = pre;
                pre = p;
            }
            p = p.right;
        }
        return root;
    }


    /**
     * 遞歸功法果真天下無敵,現階段我自認無法hold
     * <p>
     * 1.將左子樹構造成雙鏈表,並返回鏈表頭節點;
     * 2.新增一個全局變量記錄左子樹的最後一個節點;
     * 3.如果左子樹鏈表不爲空的話,將當前root追加到左子樹鏈表;
     * 4.將右子樹構造成雙鏈表,並返回鏈表頭節點;
     * 5.如果右子樹鏈表不爲空的話,將該鏈表追加到root節點之後;
     * 6.根據左子樹鏈表是否爲空確定返回的節點。
     */
    // 記錄子樹鏈表的最後一個節點,終結點只可能爲只含左子樹的非葉節點與葉節點
    protected TreeNode leftLast = null;

    public TreeNode Convert(TreeNode root) {
        if (root == null)
            return null;
        if (root.left == null && root.right == null) {
            leftLast = root;// 最後的一個節點可能爲最右側的葉節點
            return root;
        }
        // 1.將左子樹構造成雙鏈表,並返回鏈表頭節點
        TreeNode left = Convert(root.left);
        // 3.如果左子樹鏈表不爲空的話,將當前root追加到左子樹鏈表
        if (left != null) {
            leftLast.right = root;
            root.left = leftLast;
        }
        leftLast = root;// 當根節點只含左子樹時,則該根節點爲最後一個節點
        // 4.將右子樹構造成雙鏈表,並返回鏈表頭節點
        TreeNode right = Convert(root.right);
        // 5.如果右子樹鏈表不爲空的話,將該鏈表追加到root節點之後
        if (right != null) {
            right.left = root;
            root.right = right;
        }
        return left != null ? left : root;
    }

}

  1. 從上往下打印出二叉樹的每個節點,同層節點從左至右打印
package tree;

import java.util.ArrayList;

/**
 * Create by IDEA
 * User: zhangqi
 * Date: 2019/3/31
 * Desc: 從上往下打印出二叉樹的每個節點,同層節點從左至右打印
 */
public class LevelOrderTree {

    /**
     * 思路a:利用隊列先進先出的特性
     * @param root
     * @return
     */
    public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) {

        ArrayList<Integer> list = new ArrayList<>();
        ArrayList<TreeNode> queue = new ArrayList<>();

        if (root == null) {
            return list;
        }
        queue.add(root);

        while (queue.size() != 0) {
            TreeNode tree = queue.remove(0);
            if (tree.left != null) {
                queue.add(tree.left);
            }
            if (tree.right != null) {
                queue.add(tree.right);
            }
            list.add(tree.val);
        }
        return list;
    }
}

  1. 輸入一個整數數組,判斷該數組是不是某二叉搜索樹的後序遍歷的結果。如果是則輸出Yes,否則輸出No。假設輸入的數組的任意兩個數字都互不相同
package tree;

/**
 * Create by IDEA
 * User: zhangqi
 * Date: 2019/3/31
 * Desc: 輸入一個整數數組,判斷該數組是不是某二叉搜索樹的後序遍歷的結果。
 * 如果是則輸出Yes,否則輸出No。假設輸入的數組的任意兩個數字都互不相同
 */
public class LastOrderTree {


    public class Solution {

        /**
         * 思路a:後序遍歷左右根,遞歸比值大小
         * @param s
         * @return
         */
        public boolean VerifySquenceOfBST(int[] s) {

            if (s.length == 0) return false;
            if (s.length == 1) return true;

            return serch(s, 0, s.length - 1);
        }

        public boolean serch(int[] s, int start, int root) {
            if (start >= root) return true;
            int i = root;
            while (i > start && s[i - 1] > s[root]) i--;

            for (int j = start; j < i - 1; j++) {
                if (s[j] > s[root]) return false;
            }
            return serch(s, start, i - 1) && serch(s, i, root - 1);
        }
    }
}

  1. 請實現一個函數,用來判斷一顆二叉樹是不是對稱的。注意,如果一個二叉樹同此二叉樹的鏡像是同樣的,定義其爲對稱的
package tree;

/**
 * Create by IDEA
 * User: zhangqi
 * Date: 2019/3/31
 * Desc: 請實現一個函數,用來判斷一顆二叉樹是不是對稱的。注意,如果一個二叉樹同此二叉樹的鏡像是同樣的,定義其爲對稱的
 */
public class SymmetryTree {

    /**
     * 思路a:還是遞歸,只能多練習多思考了
     * @param root
     * @return
     */
    boolean isSymmetrical(TreeNode root) {
        if (root == null) return true;

        return s(root.left, root.right);
    }

    boolean s(TreeNode left, TreeNode right) {

        if (left == null) return right == null;

        if (right == null) return false;

        if (left.val != right.val) return false;

        return s(left.right, right.left) && s(left.left, right.right);
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章