二叉树的相关知识

二叉树是特殊的树,每一个节点最多有两个儿子。、

一、几个特殊的二叉树:

1.斜树:只有左子树或者只有右子树的树。

2.满二叉树:所有的分支节点都存在左子树与右子树,并且所有的叶子都在同一层。

3.完全二叉树:对一棵具有n个结点的二叉树按层序编号,如果编号为i的结点与同样深度的满二叉树中编号为i的编号的结点在二叉树中的位置完全相同,则这棵树被称为完全二叉树。// 一个满二叉树一定是完全二叉树。俩特点:1.深度为k的完全二叉树在k-1层是满二叉树,2.叶子节点只能出现在最下面两层,左侧节点都是连续的,度为1的结点只能有左孩子。

规律: 度为零的结点个数==度为2 的结点个数+1;在一棵深度为k的树中,最多有2的k次方-1个结点。

二、二叉树的遍历 (递归) //非递归要用到栈

1.前序:根左右;中序:左根右;后续:左右根;

例:前序:

void BiTree::preorder(BiNode *bt)//扩展的二叉树 
{
    if(bt==NULL) return;//递归结束的条件
    else{
        cout<<bt->data;//访问根节点
        preorder(bt->lchild);//访问根的左儿子
        preorder(bt->rchild);//访问根的右儿子
    }
}

中序以及后续操作只需要调整 访问次序就可以实现。

2.层次遍历(运用到队列)//广度优先

思想:无条件的根节点入队,进行一个循环,循环里面执行队首元素出队他的左儿子以及右儿子入队;不断执行,知道没有了。

代码:

Void BiTree::LevelOrder(BinaryTreeNode *root){
    queue<BiTreeNode*> aQueue;//存储结点指针的队列

//无条件入队
    if(root) 
        aQueue.push(root);
    while(!aQueue.empty())
    {
        root=aQueue.front(); //取队列首结点
         aQueue.pop();
        cout<<pointer->data;//访问当前结点
        if(root->lchild)//判断是否有
            aQueue.push(root->lchild);
        if(root->rchild) //同上
            aQueue.push(root->rchild);     
    }
}
三、构建与析构

递归思想

顺序构建

class BiTree
{
    public:
        BiTree(){root=create();}//对应起来 
        ~BiTree(){release(root);
    private:
        BiNode *root;
        BiNode *create();//构造函数调用 “*”不能掉了 
        void release(BiNode *bt);
};

构建函数:

BiNode *BiTree::create()
{
    BiNode *bt;
    char a;// 输入的数据什么类型需要见机行事。
    cin>>a;
    if(a=='#') bt=NULL;
    else
    {
        bt=new BiNode;
        bt->data=a;
        bt->lchild=create();
        bt->rchild=create();
    }
    return bt;//! ! !不能忘记返回值!!!
}

析构函数  递归,不断地删除。

void BiTree::release(BiNode *bt)
{
    if(bt==NULL) return;
    else
    {
        release(bt->rchild);
        release(bt->lchild);
        delete bt;
    }
}

完整的树的实现:

#include<iostream>
using namespace std;
struct BiNode
{
    char data;
    BiNode *rchild;
    BiNode *lchild;
};
class BiTree
{
    public:
        BiTree(){root=create();}
        ~BiTree(){release(root);}
        void preorder(){preorder(root);} 
	void inorder(){inorder(root);}
	void postorder(){postorder(root);}
    private:
        BiNode *root;
        BiNode *create();
        void release(BiNode *bt);
        void preorder(BiNode *bt);
        void inorder(BiNode *bt);
	void postorder(BiNode *bt);
};
BiNode *BiTree::create()
{

    BiNode *bt;
    char a;
    cin>>a;

    if(a=='#') bt=NULL;
    else
    {
        bt=new BiNode;
        bt->data=a;
        bt->lchild=create();
        bt->rchild=create();
    }
    return bt;
}
void BiTree::release(BiNode *bt)
{
    if(bt==NULL) return;
    else
    {
        release(bt->rchild);
        release(bt->lchild);
        delete bt;
    }
}

void BiTree::preorder(BiNode *bt)
{
    if(bt==NULL) return;
    else{
        cout<<bt->data;
        preorder(bt->lchild);
        preorder(bt->rchild);
    }
}

void BiTree::inorder(BiNode *bt)
{
    if(bt==NULL) return;
    else{
        inorder(bt->lchild);
        cout<<bt->data;
        inorder(bt->rchild);
    }
}

void BiTree::postorder(BiNode *bt)
{
    if(bt==NULL) return;
    else{
        postorder(bt->lchild);
        postorder(bt->rchild);
        cout<<bt->data;
    }
}

 

运行结果:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值