二叉树

二叉树

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;
    }
}

posted @ 2021-05-07 14:42  撑起一片阳光  阅读(56)  评论(0编辑  收藏  举报