9.1.1 树的定义与性质
9.1.2二叉树的递归定义:
9.1.3二叉树的存储结构与基本操作
1.二叉树的存储结构:
二叉树的结点结构:
struct node
{
typename data; //数据域
node *lchild; //指向左子树的根结点的指针
node *rchild; //指向右子树的根结点的指针
};
node *root=NULL;
创建新的二叉树结点
//生成一个新结点,v为权值
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) //查找到数字x然后将其改为newdata
{
if(root==NULL)
return ; //死树,到达递归边界
if(root->data==x) //找到数字x,则将其改为newdata
root->data=newdata;
search(root->lchild,x,newdata); //往左子树查找
search(root->rchild,x,newdata); //往右子树查找
}
二叉树结点的插入:
//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]);
return root; //返回根结点
}
二叉树存储结构图示:
完全二叉树的存储结构:
总结:*root=NULL表示root所指向的内容为空,而root=NULL表示root的这个结点的左右子树为空,所以root表示为NULL
关于函数调用时 参数的* 或者&的使用
#include<iostream>
using namespace std;
/*
void fun1(int &x) //参数为&类型,相当于直接对该地址的值进行修改,从而改变main函数中x的值
{
x=53;
}
int main()
{
int x=223;
fun1(x); 直接调用x
cout << x;
}*/
void fun2(int *x) //形参为指针,使用一个指针来接受x的地址
{
*x=443; //使用*,所以使用的时候必须是指针的方式
}
int main()
{
int x=233;
fun2(&x); //调用的是地址
cout << x;
}
类似于图中走迷宫,只要遇到岔路口就继续深入下去,一直到遍历完所有的岔路口,不碰到死胡同不回头