1.二叉树的定义
1.1 定义
二叉树为每个节点最多有两个子树的有序树,通常子树分为“左子树”和“右子树”。二叉树是一种最简单的数结构,且任何树都可以转化为二叉树。
1.2 二叉树与树的区别
1) 树的结点个数至少为1,而二叉树的节点个数可以为0.
2)树中结点的最大度数没有限制,二叉树的结点最大度数为2.
2.满二叉树
2.1 满二叉树的定义
如果一棵二叉树中所有叶节点均位于最后一层,而其他分支结点的度数均为2,则此树为满二叉树。
3.完全二叉树
3.1 完全二叉树的定义
如果一棵树扣除其最大层次那层后即成为一颗满二叉树,且最后一层的所有结点均向左靠齐,则称该二叉树为完全二叉树。
4.二叉树的性质(部分)
对于具有n个结点的完全二叉树,如果按照从上到下,同一层次上的结点按从左到右的顺序对二叉树中的所有结点从一开始顺序编号,则对于序号为 i 的结点,有:
1) 如果 i > 1,则序号为 i 的结点及其算双亲的序号为 ( i / 2 )向下取整。
2)如果 2 i > n , 则结点 i 无左孩子(否则其左孩子为结点 2 i)
3)如果 2 i+1 > n ,则结点 i 无右孩子 ,否则 其右孩子为结点 2 i + 1.
5. 构造二叉排序树
5.1 插入数据
int insert(int v,int x){ // v 为插入的值 ,x 为结点的序号
if(x == 0){ //如果目前没有结点,则将 v 值当作结点值
x = ++cnt;
t[x].val = v; //赋值
t[x].l = 0;
t[x].r = 0;
return x;
}
if(t[x].val < v) //如果有结点值,则判断v 与其左右子结点的大小关系并插入 v 值。
t[x].r = insert(v,t[x].r);
else
t[x].l = insert(v,t[x].l);
return x;
}
5.2 输出前序遍历
void dlr(int x ,vector<int> &ans){
if(x){
ans.push_back(t[x].val); //将结点值加入容器
dlr(t[x].l,ans); //递归左子树
dlr(t[x].r,ans); //递归右子树
}
}
5.3 输出后序遍历
void lrd(int x , vector<int> &ans){
if(x){
lrd(t[x].l , ans); //递归左子树
lrd(t[x].r , ans); //递归右子树
ans.push_back(t[x].val); //将结点值加入容器
}
}
5.4 link
vector<int> getAnswer (int n, vector<int> sequence){
root = cnt =0; //cnt为层数,root为跟结点
for(int i= 0;i< int(sequence.size());++i) //循环插入二叉排序树
root = insert(sequence[i],root);
vector<int> ans;
dlr(root,ans); //前序遍历
lrd(root,ans); //后续遍历
return ans;
}
end.