树根抽象为根结点,树叶概括为叶子结点。
二叉树:根结点与左子树右子树
分为满二叉树与完全二叉树
二叉树的相关代码
#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; //返回根结点
}
注意二叉树的插入阶段,是对指针的修改,因此需要使用引用的操作,来保证完成对指针所指向的地址的修改,如果是修改的是地址的内容,则不需要修改。
回顾一下链表的操作,一个结点都是两部分,一个是指针域还有一个数据域,因此建立链表的操作都是反复调用结点的结构来达成链接的目的。