二叉树的五种基本形态
二叉树(binary tree)是指树中节点的度不大于2的有序树,它是一种最简单且最重要的树。二叉树的递归定义为:二叉树是一棵空树,或者是一棵由一个根节点和两棵互不相交的,分别称作根的左子树和右子树组成的非空树;左子树和右子树又同样都是二叉树。
请问选择下面对应的图形变换,正确填空:
1. 只有一个根结点的二叉树:b
2. 只有右子树的二叉树:d
3. 只有左子树的二叉树:c
4. 空二叉树:a
5. 层数大于1的满二叉树:e
满二叉树:如果一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上,则这棵二叉树为满二叉树
二叉树的结点的个数
二叉树的相关术语
①结点(或称节点):包含一个数据元素及若干指向子树分支的信息。
②结点的度:一个结点拥有子树的数目称为结点的度,二叉树的结点度最少是0,最多是2。
③叶子结点:也称为终端结点,没有子树的结点或者度为零的结点。
④分支结点:也称为非终端结点,度不为零的结点称为非终端结点。
⑤结点的层次:从根结点开始,假设根结点为第1层,根结点的子节点为第2层,依此类推,如果某一个结点位于第L层,则其子节点位于第L+1层。
⑥树的深度:也称为树的高度,树中所有结点的层次最大值称为树的深度。
显然,只有一个结点的二叉树深度为1。问:
1. 二叉树的第4层,最多有多少结点?(8 )
2. 深度是3的二叉树,最少有多少结点?(3),最多有多少结点?( 7)
3. 有12个结点的二叉树,深度最少是多少?(4)
4. 二叉树有10个叶子结点,度为2的结点数为(9)
【提示】
二叉树的伪链表表示法
二叉树的示意图:
直观的,我们可以定义结点的数据结构:
lchild | data | rchild |
左孩子指针 | 数据 | 右孩子指针 |
注意:
二叉树的左右子树是有次序的,不能颠倒。而普通数的子树的次序是任意的。
由于C++的指针类型目前没有学习,这里可以使用结点数组的下标来模拟链表操作。
现在,有N个结点的二叉树,这些节点放在biTree数组中,每个结点的左右指针为其左右孩子节点的下标,下标从从1到N。例如下面是6个结点在biTree数组里是存储和链表结构的示意图:
这里,下标为1的是根结点,下标为0的表示空。
现在仿照前面,根据下面给出的示意图,请填写数组的内容。
第0个表示空结点 | ||
4 | x | 6 |
0 | e | 0 |
0 | d | 0 |
0 | c | 2 |
0 | k | 0 |
5 | b | 3 |
#include<bits/stdc++.h>
using namespace std;
class tree{
public:
int depth(int root)
{
if(root==0)
return 0;
return 1+max(depth(Tree[root].left),depth(Tree[root].right));
}
void inorder_traversal(int root)
{
if(root==0)
return ;
inorder_traversal(Tree[root].left);
cout<<Tree[root].data<<" ";
inorder_traversal(Tree[root].right);
}
void preorder_traversal(int root)
{
if(root==0)
return ;
cout<<Tree[root].data<<" ";
preorder_traversal(Tree[root].left);
preorder_traversal(Tree[root].right);
}
void postorder_traversal(int root)
{
if(root==0)
return ;
postorder_traversal(Tree[root].left);
postorder_traversal(Tree[root].right);
cout<<Tree[root].data<<" ";
}
void input(int left,int middle,int right)
{
Tree[middle].data=middle;
Tree[middle].left=left;
Tree[middle].right=right;
}
int find_root(int num)
{
int flag[100005]={0};
for(int i=1;i<=num;i++)
{
flag[Tree[i].left]=1;
flag[Tree[i].right]=1;
}
for(int i=1;i<=num;i++)
{
if(flag[i]==0)
return i;
}
}
private:
struct Tnode{
int left,right,data;
}Tree[100005];
};
int main(){
return 0;
}