9.1树与二叉树

树根抽象为根结点,树叶概括为叶子结点。

二叉树:根结点与左子树右子树

分为满二叉树与完全二叉树

二叉树的相关代码

#include<cstdio>
#include<cstdlib>
struct node{
    int data;       //数据域数据类型为typename
    node *lchild;       //指向左子树的根结点的指针
    node *rchild;       //指向右子树的根结点的指针
}
node* root=NULL;
//建立新的结点
node* newNode(int v){
    node* Node=new node;    //申请一个node类型的地址空间
    Node->data=v;   //结点的权值为v
    Node->lchild=Node->rchild=NULL; //初始状态下没有左右孩子
    return Node;    //返回新建结点的地址
}
//查找、修改操作
void search(node* root,int x,int newdata)
{
    if(root==NULL){
        return;     //空树。死胡同(递归边界)
    }
    if(root->data==x){
        //找到数据域为x的结点,把他修改成newdata
        root->data=newdata;
    }
    search(root->lchild,x,newdata); //往左子树搜索x(递归式)
    search(root->rchild,x,newdata); //往右子树搜索x(递归式)
}
//二叉树的插入
//insert函数将在二叉树中插入一个数据域为x的新结点
//注意根结点的指针root要使用引用,否则插入不会成功
void insert(node* &root,int x){
    if(root=NULL){
        //空树,说明查找失败。也即插入位置(递归边界)
        root =newNode(x);
        return;
    }
    if(由二叉树的性质,x应该插在左子树){
        insert(root->lchild,x); //往左子树搜索(递归式)
    }else{
        insert(root->rchild,x); //往右子树搜索(递归式)
    }
}
//二叉树的创建
node* Create(int data[],int n){
    node* root=NULL;    //新建空根结点root
    for(int i=0;i<n;i++)
    {
        insert(root,data[i]);   //将data[0]~data[n-1]插入二叉树    
    }
    return root;    //返回根结点
}

注意二叉树的插入阶段,是对指针的修改,因此需要使用引用的操作,来保证完成对指针所指向的地址的修改,如果是修改的是地址的内容,则不需要修改。

回顾一下链表的操作,一个结点都是两部分,一个是指针域还有一个数据域,因此建立链表的操作都是反复调用结点的结构来达成链接的目的。

发布了24 篇原创文章 · 获赞 6 · 访问量 458

猜你喜欢

转载自blog.csdn.net/qq_39965800/article/details/103392559