一:二叉树的结构的定义
二叉树的单个节点类似于链表节点,都是一个结构体,在结构体的内部包含一个存储该节点值的类型值和指针,不过单链表和二叉树不同的是,单链表是一个指针,指向下一个节点,而二叉树是包含2个及2个以上的指针,分别指向该节点的左边和右边,所以在单链表的基础上,我们这样定义二叉树
struct BiTreeNode{
int data;
struct BiTreeNode *lchild,*rchild;
};
类比单链表,二叉树的数据定义多了一个指针,如上代码所示,分别是lchild,和rchild,代表左子节点和右子节点。定义好结构体后,对该结构体进行别名定义
typedef struct BiTreeNode BiTreeNode;
typedef struct BiTreeNode *BiTree;
定义一个该节点类型,和定义一个该节点的指针类型。
二,初始化一个根节点。
BiTree biTree = (BiTree)malloc(sizeof(BiTreeNode));
(*biTree)->data = 9;
(*biTree)->lchild = NULL;
(*biTree)->rchild = NULL;
通过c函数malloc生成一个biTree的节点,生成节点后,可以随便赋值一个给data,然后让左右指针指向NULL。
三,添加新的节点
void addDataToBiTree(BiTree *biTree,int value){
if (!(*biTree)){
BiTree newNode = (BiTree)malloc(sizeof(BiTreeNode));
newNode->data = value;
newNode->lchild = newNode->rchild = NULL;
(*biTree) = newNode;
return;
}
if ((*biTree)->data>value){
addDataToBiTree(&(*biTree)->lchild,value);
}
else if((*biTree)->data<value){
addDataToBiTree(&(*biTree)->rchild,value);
}
}
根据代码所示,为了好理解,我们可以从第二个if开始阅读代码,如果被插入值value小于当前节点,我们就把该值放到节点左边,且该节点左边为NULL才可以被插入,否则就继续递归函数,右边也是如此。
四:输入每个节点
void printBiTree(BiTree T){
if (T == NULL){
return;
}
cout<<T->data<<endl;
printBiTree(T->lchild);
printBiTree(T->rchild);
}
此处选用二叉树的前序遍历,通过递归的方式。特别注意要给函数跳出递归的添加,该处跳出递归条件是T==NULL。
五:查找是否存在一个值
void searchValue(BiTree T, int value){
if (T->data == value){
cout<<"找到该值"<<value<<endl;
return;
}
if (T->data<value){
cout<<T->data<<endl;
searchValue(T->rchild,value);
} else if (T->data>value){
cout<<T->data<<endl;
searchValue(T->lchild,value);
}
}
通过递归。
完整代码如下:
#include <iostream>
using namespace std;
struct BiTreeNode{
int data;
struct BiTreeNode *lchild,*rchild;
};
typedef struct BiTreeNode BiTreeNode;
typedef struct BiTreeNode *BiTree;
void initBiTree(BiTree *biTree){
(*biTree)->data = 9;
(*biTree)->lchild = NULL;
(*biTree)->rchild = NULL;
}
void addDataToBiTree(BiTree *biTree,int value){
if (!(*biTree)){
BiTree newNode = (BiTree)malloc(sizeof(BiTreeNode));
newNode->data = value;
newNode->lchild = newNode->rchild = NULL;
(*biTree) = newNode;
return;
}
if ((*biTree)->data>value){
addDataToBiTree(&(*biTree)->lchild,value);
}
else if((*biTree)->data<value){
addDataToBiTree(&(*biTree)->rchild,value);
}
}
//递归
void printBiTree(BiTree T){
if (T == NULL){
return;
}
cout<<T->data<<endl;
printBiTree(T->lchild);
printBiTree(T->rchild);
}
void searchValue(BiTree T, int value){
if (T->data == value){
cout<<"找到该值"<<value<<endl;
return;
}
if (T->data<value){
cout<<T->data<<endl;
searchValue(T->rchild,value);
} else if (T->data>value){
cout<<T->data<<endl;
searchValue(T->lchild,value);
}
}
int main(){
BiTree biTree = (BiTree)malloc(sizeof(BiTreeNode));
initBiTree(&biTree);
addDataToBiTree(&biTree,10);
addDataToBiTree(&biTree,7);
addDataToBiTree(&biTree,5);
addDataToBiTree(&biTree,12);
//printBiTree(biTree);
searchValue(biTree,12);
return 1;
}