二叉树笔记(一)

/*由于创建二叉树时采用递归方式创建,所以不需要像链表那样进行头指针的更替,可以直接传入root方便观察*/
#include<iostream>
#include<cstdlib>
#include<queue>

using namespace std;

struct node
{
    int data;
    node *Ltree;
    node *Rtree;
};
//node(int x):valux(x),Ltree(nullptr),Rtree(nullptr){};结构体的函数参数初始化列表 ,默认列表解决了二叉树叶子节点后续节点为空的问题
//在c++11中,不要在声明的时候将结构体内部数据初始化


int CreateBinTree(node* &T)//采用指针引用方便更替传入指针的地址,方便new在堆中重新分配地址 (采用根左右的方法创建二叉树) 
{
    int size;
    cin>>size;
    if(size==0)   {T=NULL;} 
    else
    {
        T= new node;//默认的无参数结构体初始化 
        T->data=size;
        CreateBinTree(T->Ltree);
        CreateBinTree(T->Rtree);
    }
    return 0;
}
void PreOrderTraverse(const node* T)//前序遍历 ,const和值传递,可以有效避免更改 已有的二叉树数据 
{
    if(T!=NULL)
    {
        cout<<T->data<<" ";
        PreOrderTraverse(T->Ltree);
        PreOrderTraverse(T->Rtree);
    }

void InOrderTraverse(const node* T)//中序遍历 
{
    if(T!=NULL)
    {
        InOrderTraverse(T->Ltree);
        cout<<T->data<<" ";
        InOrderTraverse(T->Rtree);
    }
}
void PostOrderTraverse(const node* T)//后序遍历 
{
    if(T!=NULL)
    {
        PostOrderTraverse(T->Ltree);
        PostOrderTraverse(T->Rtree);
        cout<<T->data<<" ";
    } 
}
void LevelOrderTraverse(node* T)//层次遍历(通过队列实现) 广度优先遍历二叉树 
{
    queue<node*>mystack;
    if(T!=NULL)
    mystack.push(T);
    while(!mystack.empty())
    {
        if((mystack.front())->Ltree!=NULL)
        {
            mystack.push((mystack.front())->Ltree);
        }
        if((mystack.front())->Rtree!=NULL)
        {
            mystack.push((mystack.front())->Rtree);
        }
        cout<<(mystack.front())->data<<" ";
        mystack.pop();
     } 
}
int main()
{
    node *T;
    CreateBinTree(T);
    PreOrderTraverse(T);
    cout<<endl;
    InOrderTraverse(T);
    cout<<endl;
    PostOrderTraverse(T);
    cout<<endl;
    LevelOrderTraverse(T);
    return 0;
}

二叉树数据插入,可以当做另一种创建二叉树方法

//二叉树数据的插入,测试 
#include<iostream>
#include<cstdlib>

using namespace std;

struct node
{
    int data;
    node *Ltree;
    node *Rtree;
};
/*该方法控制插入的左子节点数据始终小于根节点数据,指针传参时可以更改指针所指向的地址的数据,但不可以更改指针所指向的地址,值传递中指针传递是地址的复制*/
int CreateBinTree(node* &T,int inputData)
{
    node *mark;
    mark=T;
    if(inputData==0)
    {
        return 0;
    } 
    else
    {
        while(mark->Ltree!=NULL||mark->Rtree!=NULL)//删选恰当的叶子节点做标记,方便下一步插入做准备 
        {
            if(inputData<mark->data&&inputData<mark->Rtree->data)
            {      
                mark=mark->Ltree;
            }
            else if(inputData>mark->data&&inputData>mark->Ltree->data)
            {
                mark=mark->Rtree;
            }
            else
            {
                cout<<"该数据重复,请重新输入"; 
                return 0;
            }
        }

//进行数据插入
           if(inputData<mark->data)
           {
                   mark->Ltree=new node;
                mark->Ltree->data=inputData;
                mark->Ltree->Ltree=NULL;
                mark->Ltree->Rtree=NULL; 
           }
       else if(inputData>mark->data)
       {
               mark->Rtree=new node;
            mark->Rtree->data=inputData;
            mark->Rtree->Ltree=NULL;
            mark->Rtree->Rtree=NULL; 
       }
       else
       {
           cout<<"数据重复" ; 
       }    
    }
    return 0;

void InOrderTraverse(const node* T)//中序遍历 
{
    if(T!=NULL)
    {
        InOrderTraverse(T->Ltree);
        cout<<T->data<<" ";
        InOrderTraverse(T->Rtree);
    }
}
int main()
{
    node *root;
    int m;
    root=new node;
    root->data=50;//中间判定值,可申明为常量, 
    root->Ltree=NULL;
    root->Rtree=NULL;    
    cin>>m;
    CreateBinTree(root,m);
    InOrderTraverse(root);
    return 0;
}
 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值