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

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


//……






}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
是一种常用的数据结构,具有分层的特点。在的结构中,常常需要对进行遍历操作,包括前序遍历、中序遍历、后序遍历和层次遍历。 前序遍历(Preorder Traversal)是指先遍历根节点,再遍历左子树,最后遍历右子树。可以通过递归或者栈的方式实现前序遍历。 中序遍历(Inorder Traversal)是指先遍历左子树,再遍历根节点,最后遍历右子树。同样可以通过递归或者栈的方式实现中序遍历。 后序遍历(Postorder Traversal)是指先遍历左子树,再遍历右子树,最后遍历根节点。同样可以通过递归或者栈的方式实现后序遍历。 层次遍历(Level Order Traversal)是指从上到下逐层遍历节点。可以利用队列的方式实现层次遍历,先将根节点入队,然后依次将每个节点左右节点入队,直到队列为空。 在C语言中,可以利用结构体和指针表示节点,通过递归或者迭代的方式实现的遍历操作。可以使用数组、链表或者队列等数据结构来辅助实现。 以下是一段C语言代码示例,演示了如何实现前序中序后序层次遍历操作: ```c #include <stdio.h> #include <stdlib.h> typedef struct TreeNode { int data; struct TreeNode* left; struct TreeNode* right; } TreeNode; // 前序遍历 void preorderTraversal(TreeNode* root) { if (root == NULL) return; printf("%d ", root->data); preorderTraversal(root->left); preorderTraversal(root->right); } // 中序遍历 void inorderTraversal(TreeNode* root) { if (root == NULL) return; inorderTraversal(root->left); printf("%d ", root->data); inorderTraversal(root->right); } // 后序遍历 void postorderTraversal(TreeNode* root) { if (root == NULL) return; postorderTraversal(root->left); postorderTraversal(root->right); printf("%d ", root->data); } // 层次遍历 void levelOrderTraversal(TreeNode* root) { if (root == NULL) return; TreeNode* queue[100]; // 使用数组模拟队列 int front = 0; int rear = 0; queue[rear++] = root; while (front < rear) { TreeNode* node = queue[front++]; printf("%d ", node->data); if (node->left != NULL) { queue[rear++] = node->left; } if (node->right != NULL) { queue[rear++] = node->right; } } } int main() { // 创建一棵 TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode)); root->data = 1; root->left = (TreeNode*)malloc(sizeof(TreeNode)); root->right = (TreeNode*)malloc(sizeof(TreeNode)); root->left->data = 2; root->right->data = 3; root->left->left = NULL; root->left->right = NULL; root->right->left = NULL; root->right->right = NULL; printf("前序遍历结果:"); preorderTraversal(root); printf("\n中序遍历结果:"); inorderTraversal(root); printf("\n后序遍历结果:"); postorderTraversal(root); printf("\n层次遍历结果:"); levelOrderTraversal(root); return 0; } ``` 以上代码中,先定义了的结构体`TreeNode`,包含数据、左子树指针和右子树指针。然后定义了四个遍历函数,根据不同的遍历方式实现相应的遍历过程。在`main`函数中,创建了一棵,并调用四个遍历函数分别进行遍历操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值