/*
关于树的一些实现方法,此处都是通过递归遍历实现的。
递归实现树的建立,递归前序中序后序(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(){
//……
}
关于树的一些实现方法,此处都是通过递归遍历实现的。
递归实现树的建立,递归前序中序后序(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(){
//……
}