文章目录
- 1、简介
- 2、数据结构
- 3、函数实现
- 3.1 创建二叉树
- 3.2 三种简单遍历方式
- 3.3 层序遍历方式
- 3.4 修改二叉树节点
- 3.5 交换二叉树中左右子树
- 3.6 计算节点高度
- 3.7 计算节点深度
- 4、完整代码
1、简介
二叉树有很多性质,书上都有本文不作赘述,主要介绍代码实现部分而。
2、数据结构
typedef char ElemType;
typedef struct node{
ElemType data;
int layer;
struct node* lchild;
struct node* rchild;
}BiNode,*BiTree;
3、函数实现
//先序创建二叉树
BiTree CreateBinTree();
void DLR(BiTree T);
void LDR(BiTree T);
void LRD(BiTree T);
//层序遍历的同时,求出每个节点的层数
void Level(BiTree T);
//修改二叉树中所有data为x的节点至newdata
void search(BiTree &T, ElemType x, ElemType newdata);
//交换左右子树
void Exchange(BiTree &T);
//求node节点的高度
int height(BiTree node);
//求node节点的深度
int depth(BiTree T, BiTree node);
3.1 创建二叉树
创建二叉树的方式有很多,本文使用的是先序方式创建。
BiTree CreateBinTree(){
BiTree T = new BiNode ;
ElemType data;
cin >> data;
if(data == null){
return NULL;
}else{
T->data = data;
T->lchild = CreateBinTree();
T->rchild = CreateBinTree();
}
return T;
}
3.2 三种简单遍历方式
void DLR(BiTree T){
if(T){
cout << T->data << " ";
DLR(T->lchild);
DLR(T->rchild);
}
}
void LDR(BiTree T){
if(T){
LDR(T->lchild);
cout << T->data << " ";
LDR(T->rchild);
}
}
void LRD(BiTree T){
if(T){
LRD(T->lchild);
LRD(T->rchild);
cout << T->data << " ";
}
}
3.3 层序遍历方式
层序遍历使用了队列结构帮助实现。
(1)让root入队
(2)取出队首节点并访问
(3)如果存在左子树则左子树入队
(4)如果存在右子树则右子树入队
(5)如果队列非空回到步骤二
void Level(BiTree T){
queue<BiTree> q;
if(T == NULL){
return;
}else{
T->layer = 1;
q.push(T);
while(!q.empty()){
BiTree temp = q.front();
q.pop();
cout << temp->data << " ";
if(temp->lchild){
temp->lchild->layer = temp->layer+1;
q.push(temp->lchild);
}
if(temp->rchild){
temp->rchild->layer = temp->layer+1;
q.push(temp->rchild);
}
}
}
}
3.4 修改二叉树节点
void search(BiTree &T, ElemType x, ElemType newdata){
if(T == NULL){
return;
}
if(T->data == x){
T->data = newdata;
}else{
search(T->lchild,x,newdata);
search(T->rchild,x,newdata);
}
}
3.5 交换二叉树中左右子树
void Exchange(BiTree &T){
if(T == NULL){
return;
}else{
BiTree temp = T->lchild;
T->lchild = T->rchild;
T->rchild = temp;
Exchange(T->lchild);
Exchange(T->rchild);
}
}
3.6 计算节点高度
int height(BiTree node){
int a,b;
if(node){
a = height(node->lchild);
b = height(node->rchild);
return (a > b ? a : b)+1;
}else{
return 0;
}
}
3.7 计算节点深度
int depth(BiTree T, BiTree node){
//某一个节点的深度,等于根节点的高度,减去该节点的高度
int a = height(T);
int b = height(node);
return a-b;
}
4、完整代码
#include<iostream>
#include<queue>
using namespace std;
#define null '#'
typedef char ElemType;
typedef struct node{
ElemType data;
int layer;
struct node* lchild;
struct node* rchild;
}BiNode,*BiTree;
//先序创建二叉树
BiTree CreateBinTree();
void DLR(BiTree T);
void LDR(BiTree T);
void LRD(BiTree T);
//层序遍历的同时,求出每个节点的层数
void Level(BiTree T);
//修改二叉树中所有data为x的节点至newdata
void search(BiTree &T, ElemType x, ElemType newdata);
//交换左右子树
void Exchange(BiTree &T);
//求node节点的高度
int height(BiTree node);
//求node节点的深度
int depth(BiTree T, BiTree node);
int main(){
BiTree T = CreateBinTree();
Level(T);
cout << endl << "Change each F to Z" << endl;
search(T,'F','Z');
Level(T);
cout << endl;
cout << "Get the height of the tree: "<< height(T) << endl;
cout << "Get the depth of T->lchild: " << depth(T,T->lchild) << endl;
cout << "Exchange Left and Right" << endl;
Exchange(T);
Level(T);
cout << endl;
return 0;
}
BiTree CreateBinTree(){
BiTree T = new BiNode ;
ElemType data;
cin >> data;
if(data == null){
return NULL;
}else{
T->data = data;
T->lchild = CreateBinTree();
T->rchild = CreateBinTree();
}
return T;
}
void DLR(BiTree T){
if(T){
cout << T->data << " ";
DLR(T->lchild);
DLR(T->rchild);
}
}
void LDR(BiTree T){
if(T){
LDR(T->lchild);
cout << T->data << " ";
LDR(T->rchild);
}
}
void LRD(BiTree T){
if(T){
LRD(T->lchild);
LRD(T->rchild);
cout << T->data << " ";
}
}
void Level(BiTree T){
queue<BiTree> q;
if(T == NULL){
return;
}else{
T->layer = 1;
q.push(T);
while(!q.empty()){
BiTree temp = q.front();
q.pop();
cout << temp->data << " ";
if(temp->lchild){
temp->lchild->layer = temp->layer+1;
q.push(temp->lchild);
}
if(temp->rchild){
temp->rchild->layer = temp->layer+1;
q.push(temp->rchild);
}
}
}
}
void search(BiTree &T, ElemType x, ElemType newdata){
if(T == NULL){
return;
}
if(T->data == x){
T->data = newdata;
}else{
search(T->lchild,x,newdata);
search(T->rchild,x,newdata);
}
}
int height(BiTree node){
int a,b;
if(node){
a = height(node->lchild);
b = height(node->rchild);
return (a > b ? a : b)+1;
}else{
return 0;
}
}
int depth(BiTree T, BiTree node){
//某一个节点的深度,等于根节点的高度,减去该节点的高度
int a = height(T);
int b = height(node);
return a-b;
}
void Exchange(BiTree &T){
if(T == NULL){
return;
}else{
BiTree temp = T->lchild;
T->lchild = T->rchild;
T->rchild = temp;
Exchange(T->lchild);
Exchange(T->rchild);
}
}