二叉树入门

二叉树入门

二叉树概述

二叉树(Binary Tree)是一种树形结构,实际生活中的很多问题抽象出来的数据结构是二叉树的形式。二叉树是节点的度不大于2的有序树。

常用术语介绍

节点:包含一个数据元素及若干指向子树分支的信息;
节点的度:一个节点拥有子树的数目称为节点的度;
叶子节点:没有子树的节点或者度为零的节点;
分支节点:度不为零的节点;
树的度:树中所有节点的度的最大值;
节点的层次:从根节点开始,假设根节点为第一层,根节点的子节点则为第二层,一次类推;
树的深度/高度:树中所有节点的层次最大值;
有序树:如果树中各棵子树的次序是有先后次序,就称该树为有序树;
无序树:如果树中各棵子树的次序没有先后次序,就称该树为无序树;
森林:由m(m≥0)棵互不相交的树构成一片森林。如果把一棵非空的树的根节点删除,则该树就变成了一片森林,森林中的树由原来根节点的各棵子树构成。

二叉树的性质

性质1:二叉树的第i层最多有2i-1(i≥1)个节点;
性质2:深度为h的二叉树中最多含有2h-1个节点;
性质3:若在任意一棵二叉树中,有n0个叶子节点,有n2个度为2的节点,则必有n0=n2+1;
性质4:具有n个节点的满二叉树深度为log2n+1;
性质5:若对一棵有n个节点的完全二叉树进行顺序编号(1≤i≤n),那么对于编号为i的节点有以下结论:
当i=1时,该节点为根节点,没有双亲节点;
当i>1时,该节点的双亲节点的编号为i/2;
当2i≤n时,则有编号为2i的左子节点,否则没有左子节点;
当2i+1≤n时,则有编号为2i+1的右子节点,否则没有右子节点。

特殊类型的二叉树

满二叉树:如果一棵二叉树只有度为0和度为2的节点,并且度为0的节点在同一层上,则这棵二叉树为满二叉树;
完全二叉树:深度为k,有n个节点的二叉树当且仅当其中每个节点与深度为k的满二叉树中编号从1到n的节点一一对应时,称为完全二叉树;完全二叉树的特点是叶子节点只能出现在程序最大的两层上,并且某个节点的左子树下子孙的最大层序与右子树的子孙最大层序相等或者大1。

二叉树的遍历

遍历二叉树是按照一定的规则和顺序走遍二叉树的所有节点,使每个节点都被访问一次。因为二叉树是非线性结构,所以树的遍历实际上是将二叉树的节点转换成一个线性序列来表示。二叉树的遍历分为前序遍历【根左右】、中序遍历【左根右】和后序遍历【左右根】。

二叉树删除节点

简单限定规则,如果删除的是叶子节点,就删除该节点;如果是非叶子节点,则删除该子树。

  1. 自定义二叉树示例
/**
 * MyTree.java
 */
public class MyTree {
   
    public static void main(String[] args) {
   
        //创建二叉树节点
        Tree tree = new Tree();
        Node root = new Node(1, "宋江");
        Node node2 = new Node(2, "卢俊义");
        Node node3 = new Node(3, "吴用");
        Node node4 = new Node(4, "林冲");
        Node node5 = new Node(5, "武松");
        //添加节点关联
        root.left = node2;
        root.right = node3;
        node3.right = node4;
        node4.right = node5;
        tree.setRoot(root);
        System.out.println("前序遍历:");
        tree.preOrder();
        System.out.println("中序遍历:");
        tree.infixOrder();
        System.out.println("后序遍历:");
        tree.postOrder();
        System.out.println("前序查找:");
        Node node = tree.preOrderSearch(4);
        if(node != null){
   
            System.out.printf("找到了节点id=%d,name=%s", node.id, node.name);
        }else{
   
            System.out.printf("没有找到id=%d的英雄", 4);
        }
        System.out.println();
       	System.out.println("删除前,前序遍历:");
        tree.preOrder();
        tree.delNode(4);
        System.out.println("删除后,前序遍历:");
        tree.preOrder();        
    }
    
    private static class Tree {
   
        private Node root;
        
        void setRoot(Node root) {
   
            this.root = root;
        }
        
        void preOrder() {
   
            if (this.root == null) {
   
                System.out.println("二叉树为空,不能遍历");
				return;                    
            }
            this.root.preOrder();
        }
        
        void infixOrder(){
   
            if(
  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

快乐江小鱼

知识创造财富,期待您的慷慨解囊

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值