BinaryTree树

1.“递归”是树中重要的思想;

2.度:一个节点的子节点数

3.

4完全二叉树:除最后一行,为满二叉树;(节点数为偶,n1=0,节点数为奇,n1=1);

5.节点数=边数+1,2*边数=总度数;

package BinaryTree;

import com.sun.source.tree.Tree;

import java.sql.SQLOutput;
import java.util.*;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: czt20
 * Date: 2026 -01-08
 * Time: 17:13
 */
class BinaryTree {
    static class TreeNode {
        public char val;
        public TreeNode left;
        public TreeNode right;

        public TreeNode(char val) {
            this.val = val;
        }
    }

    TreeNode creatTree() {
        TreeNode a = new TreeNode('A');
        TreeNode b = new TreeNode('B');
        TreeNode c = new TreeNode('C');
        TreeNode d = new TreeNode('D');
        TreeNode e = new TreeNode('E');
        TreeNode f = new TreeNode('F');
        TreeNode g = new TreeNode('G');
        TreeNode h = new TreeNode('H');
        a.right = c;
        a.left = b;
        b.right = e;
        b.left = d;
        e.right = h;
        c.left = f;
        c.right = g;
        return a;
    }

    //前序遍历
    void preOrder(TreeNode root) {
        if (root == null) return;
        System.out.print(root.val + " ");
        preOrder(root.left);
        preOrder(root.right);
    }
    //前序遍历(非递归)
    public void preOrderNor(TreeNode root) {
        if (root == null) return;
        Stack<TreeNode> stack=new Stack<>();
        TreeNode cur =root;
        stack.push(root);
        while (!stack.isEmpty()) {
            while (cur != null) {
                stack.push(cur);
                System.out.println(cur.val + " ");
                cur = cur.left;
            }
            TreeNode top = stack.pop();
            cur = top.right;
        }
    }
    //中序遍历
    void inOrder(TreeNode root) {
        if (root == null) return;
        inOrder(root.left);
        System.out.print(root.val + " ");
        inOrder(root.right);
    }
    //中序遍历(非递归)
    public List<Character> inorderTraversal(TreeNode root) {
        List<Character> res=new LinkedList<>();
        inorderTraversalNor(root,res);
        return res;
    }
    public void inorderTraversalNor(TreeNode root,List<Character> res) {
        if (root == null) return;
        Stack<TreeNode> stack=new Stack<>();
        TreeNode cur =root;
        while (!stack.isEmpty()||cur!=null) {
            while (cur != null) {
                stack.push(cur);
                cur = cur.left;
            }
            TreeNode top = stack.pop();
            res.add(top.val);
            cur = top.right;
        }
    }
    //后序遍历
    public void postOrder(TreeNode root) {
        if (root == null) return;
        postOrder(root.left);
        postOrder(root.right);
        System.out.print(root.val + " ");
    }

    //层序遍历
    public void levelOrder(TreeNode root) {
        if (root == null) {
            return;
        }
        Queue<TreeNode> sr = new LinkedList<>();
        sr.offer(root);

        while (!sr.isEmpty()){
            TreeNode ree=sr.poll();
            System.out.print(ree.val+" ");
            if (ree.left!=null)sr.offer(ree.left);
            if (ree.right!=null)sr.offer(ree.right);
        }
     
    }
    List<List<Integer>> lee= new ArrayList<List<Integer>>();
    public List<List<Integer>> levelOrder2(TreeNode root) {
        if(root==null)return lee;
        levelOrder2(root,0);
        return lee;
    }
    public void levelOrder2(TreeNode root,int val){
        if(lee.size()==val){
            lee.add(new ArrayList<Integer>());
        }
        lee.get(val).add(root.val);
        if(root.left!=null)levelOrder2(root.left,val+1);
        if(root.right!=null)levelOrder2(root.right,val+1);
        return;
    }
    //判断是否为完全二叉树
    public boolean ifwanquan(TreeNode root){
        if (root == null) {
            return true;
        }
        Queue<TreeNode> sr = new LinkedList<>();
        sr.offer(root);

        while (!sr.isEmpty()){
            TreeNode ree=sr.poll();
            if (ree!=null){
                sr.offer(ree.left);
                sr.offer(ree.right);
            }else{
             break;
            }
        }
         while(!sr.isEmpty()){
             TreeNode lee = sr.poll();
             if (lee!=null){
                 return  false;
             }
         }
         return true;
    }
    //获取树中节点的个数
    static int count = 0;

    void size(TreeNode root) {
        if (root == null) {
            return;
        }
        count++;
        size(root.left);
        size(root.right);
    }

    //方法2:左树加右数;
    int size2(TreeNode root) {
        if (root == null) {
            return 0;
        }
        return size2(root.right) + size2(root.left) + 1;
    }

    //叶子的个数(同理)
    int leaves(TreeNode root) {
        if (root == null) {
            return 0;
        }
        if (root.left == null && root.right == null) {
            return 1;
        }
        return leaves(root.left) + leaves(root.right);
    }

    //查找第k层右多少节点
    int getKlevelNodeCount(TreeNode root, int k) {
        if (root == null) {
            return 0;
        }
        if (k == 1) {
            return 1;
        }

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

    //树的高度
    int getHight(TreeNode root) {
        if (root == null) {
            return 0;
        }

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

    TreeNode findval(TreeNode root, char val) {
        if (root == null) {
            return null;
        }
        if (root.val == val) {
            return root;
        }
        TreeNode le = findval(root.left, val);
        if (le != null) {
            return le;
        }
        TreeNode ri = findval(root.right, val);
        if (ri != null) {
            return ri;
        }
        return null;
    }
}

全部评论

相关推荐

点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务