Skip to content

前言

二叉树体现“一分为二”的逻辑。同链表相同,二叉树的最基本单位也是“节点”,节点包括节点值、左子节点引用、右子节点引用.节点的左子节点及其以下节点形成的树称为该节点的左子树(left subtree),同理可得右子树(right subtree)。

1.二叉树的一些属性

  • 根节点:没有父节点的节点
  • 叶节点:没有子节点的节点
  • 二叉树的度:二叉树节点的子阶段数量,为0,1,或2
  • 二叉树节点的层:根节点为1层,向下没经过一条边的节点的层级+1
  • 二叉树的高度:根节点到最远叶节点之间的经过边的数量
  • 二叉树节点的高度:在该节点所在子树上,距离该节点的最远叶节点之间的边数。

2.二叉树的基本操作

2.1 初始化二叉树

先构建根节点,然后创建指针引用

rust
struct TreeNode{
    value:i32,
    leftNode:Option<Rc<RefCell<TreeNode>>>,
    RightNode:Option<Rc<RefCell<TreeNode>>>,
}
impl TreeNode{
    pub fn new(val:i32-> Re<RefCell<Self>>{
		Rc::new(RefCell::new(
        	Self{
                val,
                leftNode:None,
                rightNode:None
            }
        ))
    }
}

fn main(){
    let n1 = TreeNode::new(1),
    let n2 = TreeNode::new(2),
    let n3 = TreeNode::new(3),
    let n4 = TreeNode::new(4),
    let n5 = TreeNode::new(5),
    
    n1.borrow_mut().leftNode = Some(n2.clone());
    n1.borrow_mut().rightNode = Some(n3);
    n2.borrow_mut().leftNode = Some(n4);
    n2.borrow_mut().rightNode = Some(n5);
}

2.2 插入和删除二叉树节点

和链表插入、删除节点方法一致,改变树节点的指针指向即可,如在n2和n4,n5层之间插入节点n0:

rust
let n0 = TreeNode::new(0);
n1.borrow_mut().leftNode = Some(n0.clone());
n0.brrow_mut().leftNode = Some(n2);

倘若再删除该节点,将n1的指针重新指向n2即可:

n1.brrow_mut().leftNode = some(n2)

初始、插入和删除示意图如下:

binary_tree_operations

3. 常见二叉树的类型

3.1 完美二叉树

完美二叉树(perfect binary tree)的每一层的节点都被填充满,叶节点的度为0,其余所有节点的度均为2。完美二叉树又被称为“满树”。给定高度为h的二叉树,其节点树为:2^h+1 -1.

3.2 完全二叉树

完全二叉树(complete binary tree)仅允许最底层可以不被填满且由左向右递减。完美二叉树也是完全二叉树。

3.3 完满二叉树

完满二叉树(full binary tree),除叶节点外,所有节点均有两个子节点。

full_binary_tree

3.4 平衡二叉树

平衡二叉树(balanced binary tree)的任意节点的左子树的高度和右子树的高度的差值的绝对值不超过1。