用递归的方式对于树的各种实现(前序、中序、后序、层次、节点、深度、交换左右子树)

本文详细介绍了二叉树的多种递归操作方法,包括树的创建、遍历(先序、中序、后序)、层次遍历、节点计数、深度计算及左右子树交换等核心算法实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*
关于树的一些实现方法,此处都是通过递归遍历实现的。
递归实现树的建立,递归前序中序后序(stack),层次遍历树(queue),递归求树的节点,递归求深度,递归的交换左右子树,\
stack 和 queue使用的时候,都是尖括号
stack<int>
queue<int>
等等
*/



#include <iostream>
#include<stdio.h>
#include<stdlib.h>
#include<stack>
#include<queue>


using namespace std;


int i = 0;


//typedef struct BiTNode{
// char data;
// struct BiNode *lchild, *rchild;
//}BiTNode,BiTree;




//struct前面有typedef和没有有什么区别????????.后面的BiNode和
//BiTree之间的关系是什么。


typedef struct BiNode{
char data;
struct BiNode *lchild, *rchild;


}BiNode,BiTree;


//先序递归创建树,为什么形参部分要写成*&T,如果不是这个形式,到了T=NULL这一步是会显示错误的。
int CreateBiTree(BiTree *&T){
char ch;
ch = getchar();
cout << "请输入: " << endl;
if (ch == '#'){
T = NULL;
}
else {
T = (BiNode *)malloc(sizeof(BiNode));

T->data = ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);


}
return true;
}


//递归先序遍历
void PreOrderBitree(BiTree *T){
cout << "" << endl;
if (T != NULL)
{
cout << T->data;
PreOrderBitree(T->lchild);
PreOrderBitree(T->rchild);


}
}




// 递归中序遍历
void InOrderBitree(BiTree *T){
cout << "" << endl;
if (T != NULL)
{
InOrderBitree(T->lchild);
cout << T->data;
InOrderBitree(T->rchild);


}
}


// 递归后序遍历
void LastOrderBitree(BiTree *T){
cout << "" << endl;
if (T != NULL)
{

LastOrderBitree(T->lchild);
LastOrderBitree(T->rchild);
cout << T->data;


}
}




//层次递归遍历。
/*
用到队列,先进去一个,然后,输出第一个元素,看其是否有左右孩子,如果有左右孩子,
则都进到队列中,pop掉,现在的front,
进入循环,即输出队列中的第一个元素,看其是否有左右孩子,……
进入循环,输出队列中的第一个元素,看其是否有左右孩子……………………


*/
void levelOrder(BiTree *T){
queue<BiTree*> q;
BiTree *p = T;
q.push(p);
while (!q.empty()){
p = q.front();
cout << p->data;
q.pop();
if (p->data)
q.push(p->lchild);
if (p->rchild)
q.push(p->rchild);
}
}






//递归统计二叉树的叶子节点的个数


int left(BiTree *T){
if (T){
if (T->lchild == NULL && T->rchild == NULL)
++i;
else
left(T->lchild);
left(T->rchild);

}
return i;
}








//遍历求树的深度    ^^^^^^^^^^^^^^^^^^对于递归的层层继续~~~~~~·
int maxNumber(BiTree *T){
if (!T)
return;
else{
int left = maxNumber(T->lchild);
int right = maxNumber(T->rchild);
if (left > right)
return left + 1;
else
return right + 1;
}


}






/*
先要进行判断,如果T是空的,或者左孩子和右孩子都是空,
则说明是空树或者只有一个节点
或者到了叶子节点了。
因为下面有自己递归,
所以会有第三种可能性。






*/
//递归的调换左右子树的算法
BiTree* Change(BiTree *T){




BiTree *p;
if (T == NULL || T->lchild == NULL&&T->rchild == NULL)
return T;
p = T->lchild;
T->lchild = T->rchild;
T->rchild = p;
if (T->lchild)
T->lchild = Change(T->lchild);
if (T->rchild)
T->rchild = Change(T->rchild);


return T;


}






int main(){


//……






}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值