二叉树的输出

本文详细探讨了二叉树的遍历方法,包括前序遍历、中序遍历和后序遍历,以及如何通过这些遍历方式实现二叉树的有序输出。通过对具体例子的分析,读者将能够掌握各种遍历策略及其在实际问题中的应用。

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

例如:按树输出如下:


#include <stdio.h>  
#include <stdlib.h>  
#include <malloc.h>  
#define MAXSIZE 100  
typedef char ElemType;  
typedef struct Node  
{  
    ElemType data;  
    struct Node *lchild;  
    struct Node *rchild;  
}*BitTree,BitNode;  
  
void CreateBitTree2(BitTree *T,char str[]);//非递归创建二叉树  
void LevelPrint(BitTree T);//按层次打印二叉树的结点  
void TreePrint(BitTree T,int level);//按树状形式打印二叉树  
void DestroyBitTree(BitTree *T);//销毁二叉树  

#include "LinkBiTree.h"  
  
void CreateBitTree2(BitTree *T,char str[])//非递归创建二叉树  
{  
    char ch;  
    BitTree stack[MAXSIZE];  
    int top = -1;  
    int flag,k;  
    BitNode *p;  
    *T = NULL,k = 0;  
    ch = str[k];  
    while(ch != '\0')  
    {  
        switch(ch)  
        {  
        case '(':  
            stack[++top] = p;  
            flag = 1;  
            break;  
        case ')':  
            top--;  
            break;  
        case ',':  
            flag = 2;  
            break;  
        default:  
            p = (BitTree)malloc(sizeof(BitNode));  
            p->data = ch;  
            p->lchild = NULL;  
            p->rchild = NULL;  
            if(*T == NULL)  
            {  
                *T = p;  
            }  
            else  
            {  
                switch(flag)  
                {  
                case 1:  
                    stack[top]->lchild = p;  
                    break;  
                case 2:  
                    stack[top]->rchild = p;  
                    break;  
                }  
            }  
        }  
        ch = str[++k];  
    }  
}  
void LevelPrint(BitTree T)//按层次打印二叉树的结点  
{  
    BitTree queue[MAXSIZE];  
    BitNode *p;  
    int front,rear;  
    front = rear = -1;  
    rear++;  
    queue[rear] = T;  
    while(front != rear)  
    {  
        front = (front+1)%MAXSIZE;  
        p = queue[front];  
        printf("%c ",p->data);  
        if(p->lchild != NULL)  
        {  
            rear = (rear+1)%MAXSIZE;  
            queue[rear] = p->lchild ;  
        }  
        if(p->rchild != NULL)  
        {  
            rear = (rear+1)%MAXSIZE;  
            queue[rear] = p->rchild ;  
        }  
    }  
}  
void TreePrint(BitTree T,int level)//按树状形式打印二叉树  
{  
    int i;  
    if(T == NULL)  
    {  
        return;  
    }  
    TreePrint(T->rchild ,level+1);  
    for(i = 0;i < level;i++)  
    {  
        printf("  ");  
    }  
    printf("%c\n",T->data);  
    TreePrint(T->lchild ,level+1);  
}  
  
void DestroyBitTree(BitTree *T)//销毁二叉树  
{  
    if(*T)  
    {  
        if((*T)->lchild)  
        {  
            DestroyBitTree(&((*T)->lchild));  
        }  
        if((*T)->rchild)  
        {  
            DestroyBitTree(&((*T)->rchild));  
        }  
        free(*T);  
        *T = NULL;  
    }  
}  

#include "LinkBiTree.h"  
  
int main(void)  
{  
    BitTree T,root;  
    printf("利用括号嵌套建立二叉树:\n");  
    CreateBitTree2(&T,"(a(b(c,d),e(f(,g),h(i))))");  
    printf("按层次输出二叉树序列:\n");  
    LevelPrint(T);  
    printf("\n");  
    printf("按树状打印二叉树:\n");  
    TreePrint(T,1);  
    printf("\n");  
    printf("利用括号嵌套建立二叉树:\n");  
    CreateBitTree2(&root,"(A(B(D(,H),E(,I)),C(F,G)))");  
    printf("按层次输出二叉树序列:\n");  
    LevelPrint(root);  
    printf("\n");  
    printf("按树状打印二叉树:\n");  
    TreePrint(root,1);  
    printf("\n");  
    DestroyBitTree(&T);  
    DestroyBitTree(&root);  
    return 0;  
}  

运行结果如下:




### C语言实现输出二叉树叶子节点 在C语言中,可以通过递归方法来遍历一棵二叉树,并找到所有的叶子节点。以下是具体的实现方式: #### 定义二叉树结构 首先定义一个二叉树的节点结构 `BinaryTree`,该结构包含了指向左右子树的指针以及存储的数据字段。 ```c typedef struct BinaryTree { void *nodeData; // 数据域 int index; // 节点索引号 struct BinaryTree *rightTree; // 右子树 struct BinaryTree *leftTree; // 左子树 } BinaryTree; ``` #### 创建二叉树节点函数 通过动态内存分配创建一个新的二叉树节点。 ```c #include <stdlib.h> #define MemMode 1 #if MemMode #define BinTree_Malloc malloc #define BinTree_Free free #else #define BinTree_Malloc mymalloc0 #define BinTree_Free myfree0 #endif BinaryTree* createBinaryTreeNode(void *nodeData) { BinaryTree *newNode = (BinaryTree *)BinTree_Malloc(sizeof(BinaryTree)); if (newNode != NULL) { newNode->nodeData = nodeData; newNode->leftTree = NULL; newNode->rightTree = NULL; } return newNode; } ``` #### 遍历并打印叶子节点 为了输出二叉树中的所有叶子节点,可以编写一个递归函数。如果某个节点既没有左孩子也没有右孩子,则它是叶子节点。 ```c void printLeafNodes(BinaryTree *root) { if (root == NULL) { return; // 如果当前节点为空,则返回 } // 判断是否为叶子节点 if (root->leftTree == NULL && root->rightTree == NULL) { printf("%d ", *(int *)(root->nodeData)); // 假设数据是整数类型 return; } // 递归访问左子树和右子树 printLeafNodes(root->leftTree); printLeafNodes(root->rightTree); } ``` 以上代码实现了对二叉树叶子节点的查找与输出功能[^1]。需要注意的是,在实际应用中可能需要根据具体需求调整数据类型的处理逻辑。 #### 测试代码示例 下面是一个完整的测试程序,用于验证上述函数的功能。 ```c #include <stdio.h> #include <stdlib.h> // 结构体定义部分省略... int main() { // 构建简单的二叉树 BinaryTree *root = createBinaryTreeNode((void *)1); root->leftTree = createBinaryTreeNode((void *)2); root->rightTree = createBinaryTreeNode((void *)3); root->leftTree->leftTree = createBinaryTreeNode((void *)4); root->leftTree->rightTree = createBinaryTreeNode((void *)5); root->rightTree->rightTree = createBinaryTreeNode((void *)6); // 打印叶子节点 printf("叶子节点: "); printLeafNodes(root); printf("\n"); // 清理内存资源... return 0; } ``` 运行此程序后会输出如下结果: ``` 叶子节点: 4 5 6 ``` 这表明成功找到了给定二叉树的所有叶子节点[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值