• 二叉树


    二叉树

    1.概念

    1)每个结点最多只能有两个子节点的一种形式称为二叉树

    2)二叉树的子节点分为左节点和右节点。

    3)如果该二叉树的所有叶子节点都在最后一层,并且结点总数=2^n - 1,n为层数,则成为满二叉树。

    4)如果该二叉树的所有叶子节点都在最后一层或者倒数第二层,而且最后一层叶子节点在左边连续,倒数第二层叶子结点在右边连续,我们称为完全二叉树。

    2.二叉树的遍历

    前序遍历:根结点、左子树、右子树;

    中序遍历:左子树、根节点、右子树;

    后序遍历:左子树、右子树、根节点;

    层序遍历:从上往下,从左往右一次遍历

      遍历思路:首先创建一个辅助队列,让根节点E入队,判断E是否有左右子树,有则入队,一次类推,直到找完。如下图:
    

    3.二叉树的查找

    代码

    package com.sratct.tree;
    
    import jdk.nashorn.internal.ir.IfNode;
    
    public class BinaryTreeDemo {
        public static void main(String[] args) {
            BinaryTree binaryTree = new BinaryTree();
            Node node = new Node(1);
            Node node1 = new Node(2);
            Node node2 = new Node(3);
            Node node3 = new Node(4);
            Node node4 = new Node(5);
            node.left = node1;
            node.right = node2;
            node2.left = node4;
            node2.right = node3;
            Node node5 = binaryTree.qSearch(node, 6);
        if (node5 != null) {
            System.out.println(node5.no);
        } else {
            System.out.println("未找到");
        }
    
        }
    }
    class BinaryTree{
        // 前序遍历
         public void qList(Node root) {
             if (root!=null) {
                 System.out.println(root.no);
                 if (root.left != null) {
                     qList(root.left);
                 }
                 if (root.right != null) {
                     qList(root.right);
                 }
             } else {
                 System.out.println("二叉树为空");
             }
         }
        // 中序遍历
        public void zList(Node root) {
            if (root != null) {
                if (root.left != null) {
                    zList(root.left);
                }
                System.out.println(root.no);
                if (root.right != null) {
                    zList(root.right);
                }
            } else {
                System.out.println("二叉树为空");
            }
        }
        // 后序遍历
        public void hList(Node root) {
            if (root != null) {
                if (root.left != null) {
                    hList(root.left);
                }
                if (root.right != null) {
                    hList(root.right);
                }
    
                System.out.println(root.no);
            } else {
                System.out.println("二叉树为空");
            }
        }
     /**
         *  层序遍历
         *
         */
        public void cList(Node root) {
            LinkedList<Node> nodes = new LinkedList<>();
            // 根节点入队
            nodes.offer(root);
            Node cur = null;
            while (!nodes.isEmpty()) {
                // 结点出队
                Node poll = nodes.poll();
                System.out.println(poll.no);
                // 判断该结点的左子节点是否为null,不为null则入队
                if (poll.left != null) {
                    nodes.offer(poll.left);
                }
                // 判断该结点的右子节点是否为null,不为null则入队
                if (poll.right != null) {
                    nodes.offer(poll.right);
                }
            }
        }
        // 前序查找
        public Node qSearch(Node root, int no) {
             // 如果等于当前结点则返回
             if (root.no == no) {
                 return root;
             }
             // 左递归
            Node lResult = null;
            if (root.left != null) {
                lResult = qSearch(root.left, no);
            }
             if (lResult != null) {  // 不为null则返回
                 return lResult;
             }
             // 右递归
             if (root.right != null) {
                 return qSearch(root.right,no);
             }
             return null;
        }
    
        // 中序查找
        public Node zSearch(Node root, int no) {
           Node lNode = null;
             if (root.left != null) {
                 lNode = zSearch(root.left, no);
             }
             if (lNode != null) {
                 return lNode;
             }
             if (root.no == no) {
                 return root;
             }
             if (root.right != null) {
                 return zSearch(root.right, no);
             }
             return null;
        }
    
        // 后续遍历
        public Node hSearch(Node root, int no) {
             Node lNode = null;
             if (root.left != null) {
                 lNode = hSearch(root.left,no);
             }
             if (lNode != null) {
                 return lNode;
             }
             Node rNode = null;
             if (root.right != null) {
                 rNode = hSearch(root.right, no);
             }
             if (rNode != null) {
                 return rNode;
             }
             if (root.no == no) {
                 return root;
             }
             return null;
        }
    }
    // 创建结点
    class Node{
        public int no;
        public Node left;
        public Node right;
    
        public Node(int no) {
            this.no = no;
        }
    }
    
    
  • 相关阅读:
    2015IBM上海的一道笔试题
    通过SQL进行远程访问
    TreeSet集合
    Linux学习(11-23)
    使用OpenSessionInViewFilter的注意事项
    css position 几种定位
    css jquery 实现轮播效果
    jquery Jsonp的使用
    struts2的分页标签
    Elipse clean后无法编译出class文件
  • 原文地址:https://www.cnblogs.com/cqyp/p/14738046.html
Copyright © 2020-2023  润新知