二叉树(Binary Tree,BT)的概念和性质

二叉树是一种特殊树形结构,每个节点最多有两个子节点,分为左子树和右子树。二叉树有5种形态,包括满二叉树和完全二叉树。满二叉树是完全二叉树的特殊情况。完全二叉树的判断方法包括特定的节点数与深度关系,以及特定的节点分布规律。

二叉树是一种比较特殊的树形结构,也比较常见,其特点是每个节点最多只有二棵子树,即二叉树中不存在度大于2的节点。二叉树的子树有左子树、右子树之分,孩子同样也有左孩子、右孩子之分(次序不能颠倒)。

一般地,二叉树有如下5种形态。



一般地,树的很多概念和属于也适用于二叉树,但也有一些不同:

二叉树不存在度大于2的节点但树可以;

二叉树一定是有序的;

二叉树可以为空,树不能为空等。

二叉树有一下两个比较重要的性质:

1、第i层至多有个节点(i 1);

2、深度为k的二叉树至多有个节点(k1);

当一棵二叉树深度为k且有个节点时,我们称其为满二叉树。

     

                       满二叉树                                                  完全二叉树

那么什么是完全二叉树呢?深度为k,有n个节点的二叉树当仅仅当其每一个节点都与深度为k的满二叉树编号从1到n的节点都与深度为k的满二叉树中编号从1 到n的节点一一对应的,称为完全二叉树.可以这么说,满二叉树一定是完全二叉树,但完全二叉树不一定是满二叉树.

自己总结了一下完全二叉树的判断方法:

1、假如去掉最深层的叶节点,上面的二叉树为满二叉树;

2、除了根节点之外的所有节点数之和除以2后余数为零.

[感觉自己牛逼死了o( ̄▽ ̄)d(逃~]

完全二叉树有如下几点特征:

1、叶节点只可能出现在最下面两层上;

2、对任一节点,若其右子树深度为n,则其左子树的深度必为n或n+1;

3、对任何一棵二叉树,如果其叶节点数为,度为2的节点数为,则一点满足

4、具有n个节点的完全二叉树的深度为(trunc为取整函数);

5、一棵n个节点的二叉树,对于任一编号为i的节点,有

①如果i=1,则节点i为根,无父节点;如果i>1,则其父节点编号为trunc(i/2);

②如果2*i>n,则节点i为叶节点,否则左孩子编号为2*i;

③如果2*i+1>n,则节点i无右孩子,否则右孩子编号为2*i+1.

为了创建一个简单的二叉树结构,我们可以定义两个类:`TreeNode`(表示树中的单个节点) `BinaryTree`(代表整个二叉树)。这里我将给出基本的Java实现,并使用`java.util.ArrayList`来存储节点。 首先,我们定义`TreeNode`类: ```java public class TreeNode { int data; // 节点的数据 TreeNode left; // 左子节点 TreeNode right; // 右子节点 public TreeNode(int data) { this.data = data; left = null; right = null; } } ``` 接下来,我们定义`BinaryTree`类,包含根节点其他辅助方法: ```java import java.util.ArrayList; public class BinaryTree { private TreeNode root; public BinaryTree() { root = null; } public void insert(int data) { root = insertNode(root, data); } private TreeNode insertNode(TreeNode node, int data) { if (node == null) { return new TreeNode(data); } if (data < node.data) { node.left = insertNode(node.left, data); } else if (data > node.data) { node.right = insertNode(node.right, data); } return node; } // 添加其他可能的方法,如遍历、删除等 // 以及可视化方法(如果使用图形界面,例如Swing或JavaFX) } ``` 对于可视化二叉树,通常会使用图形库如JUNG(Java Universal Network/Graph Framework)或JavaFX的Scene Graph。这里提供一个简化的可视化示例,但实际应用时可能需要更复杂的图形渲染: ```java import javafx.scene.Scene; import javafx.scene.layout.Pane; import javafx.scene.shape.Rectangle; import javafx.stage.Stage; public void visualize(TreeNode node, Pane pane) { if (node != null) { Rectangle rect = new Rectangle(30, 30); rect.setFill(Color.BLUE); // 设置节点颜色 rect.setTranslateX(node.data * 50); // 假设每个节点宽度为30px,根据数据值偏移位置 rect.setTranslateY(node.level * 50); // 根据深度设置y坐标,假设每一层的高度为50px pane.getChildren().add(rect); visualize(node.left, pane); visualize(node.right, pane); } } // 使用场景舞台进行显示 public static void main(String[] args) { BinaryTree bt = new BinaryTree(); // 先插入节点... Stage stage = new Stage(); Pane rootPane = new Pane(); Scene scene = new Scene(rootPane, 800, 600); visualize(bt.root, rootPane); stage.setScene(scene); stage.show(); } ``` 这个例子使用了JavaFX来绘制一个静态的二维视图,实际上,动态更新交互可能需要更复杂的方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值