树的一般知识

树的一般知识

非递归遍历

preorder

最开始将根节点放进栈里。然后拿出来,按照先进后出的原则,先放右儿子,再放左儿子。对着两个点也如此操作。直到整棵树的节点被访问过。

伪代码:

void  Preorder (struct  node  * t)   {             
    Inistack(s); 
     if  ( t )  Push( s,  t );
     while  ( ! Empty( s )  {
           Pop( s,  t );
           visit( t );
           if  ( t->rchild )  Push( s, t->rchild );
           if  ( t->lchild )  Push( s, t->lchild );
     }
}

postorder

给每个节点打一个标记。节点刚进入栈里,标记是 0 0 0 。如果节点的两个儿子都已进栈,标记设置为 1 1 1 ,。标记是 0 0 0 的节点被访问时,节点的右、左儿子进栈。标记为 1 1 1 的节点被访问,节点出栈。

inorder

也是采用打标记的思路。不同的是,标记为 0 0 0 被访问,左儿子进栈,标记设置为 1 1 1 ;标记为 1 1 1 被访问,先出栈,然后右儿子进栈。

森林和树的转换

  1. 树转二叉树

将树用 parent-siblings 表示法表示。parent 连接最左边的孩子作为左儿子,而从左儿子依次向右连接 siblings 作为右儿子。

  1. 多个二叉树转一个二叉树

选定一个二叉树的根节点作为根节点,其余二叉树根节点依次作为右儿子连接。

  1. 二叉树转树

1 1 1 的步骤反过来即可。

构造Huffman树

给定了一堆字母和他们分别的出现次数,用 01 01 01 串编码。

创建一个堆(优先队列),里面的节点信息:

  1. 左右儿子编号
  2. 比较键值,在这里是出现次数

一开始编号从 1 1 1 n n n,全都扔堆里。每次依次拿出两个堆顶,创建一个新节点,左右儿子是这两个节点,键值是他们的和,编号顺着 + 1 +1 +1,再扔进去。直到堆里只剩下一个,就是根。

构建好 Huffman 树,从根节点向左走编码串后加 0 0 0,向右走编码串后加 1 1 1

AVL树的节点数

如果定义空树的深度为 − 1 -1 1, 找出深度为 i i i 的AVL树的最少节点数 f ( i ) f(i) f(i)

f ( 0 ) = 1 f ( 1 ) = 2 f ( 2 ) = 4 … f ( 5 ) = 20 f ( 6 ) = 33 … f(0)=1 \\ f(1)=2 \\ f(2)=4 \\ \dots \\ f(5)=20 \\ f(6)=33 \\ \dots f(0)=1f(1)=2f(2)=4f(5)=20f(6)=33
构造深度为 i i i 的树,应该选取根节点,然后在左子树上构造深度为 i − 1 i-1 i1 的树,右子树上构造深度为 i − 2 i-2 i2的树。这样 f ( i ) = f ( i − 1 ) + f ( i − 2 ) + 1 f(i) = f(i-1) + f(i-2) + 1 f(i)=f(i1)+f(i2)+1

度与节点的关系

节点的度,是节点的子树个数,也是节点的子节点个数,还是与节点相连的次级边的个数。给出所有有度节点的度,将其相加,就得到了整棵树的边数。 + 1 +1 +1 就是节点数。

如果设树的度为 n n n,度为 i i i 的节点有 d i d_i di 个,那么可以求出叶子结点:

N = 1 + ∑ i = 1 n i × d i − ∑ i = 1 n d i = 1 + ∑ i = 1 n ( i − 1 ) × d i N = 1+\sum_{i=1}^{n} i \times d_i - \sum_{i=1}^{n} d_i = 1 + \sum_{i=1}^{n} (i-1)\times d_i N=1+i=1ni×dii=1ndi=1+i=1n(i1)×di

特别地,二叉树中,叶子结点个数等于度为 2 2 2 的节点数 + 1 +1 +1

AVL插入和删除

在任意一棵非空平衡二叉树(AVL 树) T 1 T_1 T1中,删除某结点 v 之后形成平衡二叉树 T 2 T_2 T2,再将 v v v 插入 T 2 T_2 T2形成平衡二叉树 T 3 T_3 T3。下列关于 T 1 T_1 T1 T 3 T_3 T3的叙述中,正确的是:(2分)

  1. v v v T 1 T_1 T1的叶结点,则 T 1 T_1 T1 T 3 T_3 T3可能不相同
  2. v v v 不是 T 1 T_1 T1的叶结点,则 T 1 T_1 T1 T 3 T_3 T3一定不同
  3. v v v 不是 T 1 T_1 T1的叶结点,则 T 1 T_1 T1 T 3 T_3 T3一定相同

在这里插入图片描述

删除 2 2 2,得到

在这里插入图片描述

再插入 2 2 2, 就得到原来的树。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值