c语言二叉树中序遍历代码讲解
时间: 2023-10-01 21:08:34 浏览: 128
好的,以下是C语言二叉树中序遍历的代码讲解:
中序遍历是指先访问树的左子树、再访问根节点、最后访问右子树。下面是其代码实现:
```c
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
};
void inorderTraversal(struct TreeNode* root){
if (root == NULL) return;
inorderTraversal(root->left);
printf("%d ", root->val);
inorderTraversal(root->right);
}
```
我们定义了一个二叉树的结构体`TreeNode`,其包含节点的值`val`以及左右子结点的指针。利用这个结构体,我们定义了一个中序遍历的函数`inorderTraversal`,其以指向根结点的指针`root`为参数。
函数代码采用递归的方式实现,代码的前两行首先进行基准情况的处理。若根节点`root`为`NULL`,则函数直接返回。若当前节点不是空节点,则按照中序遍历的顺序遍历左子树、输出根节点、遍历右子树。
下面是一个示例二叉树的中序遍历结果:
```
1
/ \
2 3
\ /
4 5
```
其中序遍历结果为`2 4 1 5 3`。
相关问题
c语言里中序遍历二叉树的非递归算法讲解
好的,下面是中序遍历二叉树的非递归算法讲解:
中序遍历二叉树的非递归算法需要用到栈结构,它的基本思路如下:
1. 从根节点开始,将节点依次入栈,直到左子树为空的节点为止;
2. 弹出栈顶元素并访问,如果它有右子树,则将右子树根节点入栈,并重复步骤1;
3. 直到栈为空,算法结束。
以下是C代码实现:
```
void inorderTraversal(struct TreeNode* root){
if(root == NULL) return;
struct TreeNode* stack[1000]; //用于存放节点的栈
int top = 0; //栈顶指针
struct TreeNode* p = root;
while(top > 0 || p != NULL){
if(p != NULL){ //将当前节点及其所有左子树入栈
stack[++top] = p;
p = p->left;
}else{ //左子树为空,弹出栈顶元素并访问
p = stack[top--];
printf("%d ", p->val);
p = p->right; //若有右子树,继续遍历
}
}
}
```
我们可以调用该函数进行二叉树的中序遍历:
```
int main(){
struct TreeNode a = {1, NULL, NULL};
struct TreeNode b = {2, NULL, NULL};
struct TreeNode c = {3, &a, &b};
struct TreeNode d = {4, NULL, NULL};
struct TreeNode e = {5, &d, &c};
inorderTraversal(&e);
return 0;
}
```
输出结果为:
```
4 5 1 3 2
```
希望这个讲解能够帮到你,如有其他问题,欢迎随时向我提问。
二叉树的基本操作 内容:使用二叉链表存储结构建立一棵二叉树,完成如下功能: 1.创建二叉树 2.先序遍历二叉树 3.中序遍历二叉树 4.后序遍历二叉树 5.求二叉树深度 6.求二叉树叶子结点个数数据结构C语言版
好的,我来给你讲解一下二叉树的基本操作。
二叉树是一种树形结构,每个节点最多有两个子节点。在实现二叉树时,我们一般使用二叉链表存储结构。
二叉链表结构体定义如下:
```
typedef struct BiTNode {
int data; // 节点数据
struct BiTNode *lchild, *rchild; // 左右子节点指针
} BiTNode, *BiTree;
```
接下来,我们就可以完成二叉树的基本操作了。
1. 创建二叉树
在创建二叉树时,我们可以采用递归的方式,依次输入每个节点的值,如果该节点没有子节点,则指针置为 NULL。
```
void CreateBiTree(BiTree *T) {
int data;
scanf("%d", &data);
if (data == -1) { // 输入-1表示该节点为空
*T = NULL;
} else {
*T = (BiTree)malloc(sizeof(BiTNode));
(*T)->data = data;
CreateBiTree(&(*T)->lchild); // 递归创建左子树
CreateBiTree(&(*T)->rchild); // 递归创建右子树
}
}
```
2. 先序遍历二叉树
先序遍历二叉树的顺序为:根节点 -> 左子树 -> 右子树。我们可以使用递归的方式来实现。
```
void PreOrderTraverse(BiTree T) {
if (T == NULL) {
return;
}
printf("%d ", T->data); // 先访问根节点
PreOrderTraverse(T->lchild); // 再先序遍历左子树
PreOrderTraverse(T->rchild); // 最后先序遍历右子树
}
```
3. 中序遍历二叉树
中序遍历二叉树的顺序为:左子树 -> 根节点 -> 右子树。同样也可以使用递归的方式来实现。
```
void InOrderTraverse(BiTree T) {
if (T == NULL) {
return;
}
InOrderTraverse(T->lchild); // 先中序遍历左子树
printf("%d ", T->data); // 再访问根节点
InOrderTraverse(T->rchild); // 最后中序遍历右子树
}
```
4. 后序遍历二叉树
后序遍历二叉树的顺序为:左子树 -> 右子树 -> 根节点。同样也可以使用递归的方式来实现。
```
void PostOrderTraverse(BiTree T) {
if (T == NULL) {
return;
}
PostOrderTraverse(T->lchild); // 先后序遍历左子树
PostOrderTraverse(T->rchild); // 再后序遍历右子树
printf("%d ", T->data); // 最后访问根节点
}
```
5. 求二叉树深度
二叉树的深度为其根节点到最远叶子节点的最长路径。我们可以使用递归的方式来求解。
```
int GetDepth(BiTree T) {
if (T == NULL) {
return 0;
}
int left_depth = GetDepth(T->lchild); // 左子树的深度
int right_depth = GetDepth(T->rchild); // 右子树的深度
return left_depth > right_depth ? left_depth + 1 : right_depth + 1;
}
```
6. 求二叉树叶子结点个数
叶子节点是指没有子节点的节点。我们同样可以使用递归的方式来求解。
```
int GetLeafCount(BiTree T) {
if (T == NULL) {
return 0;
}
if (T->lchild == NULL && T->rchild == NULL) { // 如果该节点是叶子节点
return 1;
}
int left_count = GetLeafCount(T->lchild); // 左子树的叶子节点数
int right_count = GetLeafCount(T->rchild); // 右子树的叶子节点数
return left_count + right_count;
}
```
好了,以上就是二叉树的基本操作了,希望能对你有所帮助。
阅读全文