二叉树之前序/中序/后序和层次遍历

Posted yunshouhu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树之前序/中序/后序和层次遍历相关的知识,希望对你有一定的参考价值。


#include <iostream>
#include <cstring>
#include <queue>
using namespace std;

typedef struct TreeNode
    char data;
    TreeNode* left;
    TreeNode* right;
 TreeNode;

#define STR_SIZE 1024


//创建二叉树
int createBTNode(TreeNode** BT, char* str, int n) 
    char ch = str[n++];  // 把第 n 个字符赋给ch,方便后面判断,字符下标后移
    if (ch != '\\0')     // 如果 ch 不等于结束符就继续创建,否则就结束
        if (ch == '#')  // 以 # 号代表 NULL,下面没有了
            *BT = NULL;
         else 
            if (!(*BT = (TreeNode*)malloc(sizeof(TreeNode)))) 
                printf("内存分配失败!");
                exit(-1);
             else 
                (*BT)->data = ch;
                n = createBTNode(&((*BT)->left), str, n); // 左递归创建
                n = createBTNode(&((*BT)->right), str, n); // 右递归创建
            
        
    
    // 返回 n,记录字符串使用到哪里了
    return n;

//前序遍历
void preOrder(TreeNode* bt)

    if(bt!=NULL)
    
        printf("%c->",bt->data);
        preOrder(bt->left);
        preOrder(bt->right);
    

//中序遍历
void inOrder(TreeNode* bt)

    if(bt!=NULL)
    
        inOrder(bt->left);
        printf("%c->",bt->data);
        inOrder(bt->right);
    

//后序遍历
void postOrder(TreeNode* bt)

    if(bt!=NULL)
    
        postOrder(bt->left);
        postOrder(bt->right);
        printf("%c->",bt->data);
    


//层次遍历
//https://leetcode-cn.com/problems/binary-tree-level-order-traversal/solution/er-cha-shu-de-ceng-xu-bian-li-by-leetcode-solution/
void levelOrder(TreeNode* bt) 
    queue<TreeNode*> q;
    TreeNode* root=bt;
    if(root!=NULL)
    
        q.push(bt);//根节点入队列
    
    while(!q.empty())
    
        int currentLevelSize=q.size();
        for(int i=0;i<currentLevelSize;i++)
        
            //出队列
            TreeNode* node=q.front();
            printf("%c->",node->data);
            q.pop();
            if(node->left!=NULL)
            
                q.push(node->left);
            
            if(node->right!=NULL)
            
                q.push(node->right);
            
        
    


void levelOrder_getFirst(TreeNode* bt) 
    queue<TreeNode*> q;
    TreeNode* root=bt;
    if(root!=NULL)
    
        q.push(bt);//根节点入队列
    
    while(!q.empty())
    
        int currentLevelSize=q.size();//每一个层
        for(int i=0;i<currentLevelSize;i++)
        
            //出队列
            TreeNode* node=q.front();
            if(i == 0)
            
                printf("%c->",node->data);
            
            q.pop();
            if(node->left!=NULL)
            
                q.push(node->left);
            
            if(node->right!=NULL)
            
                q.push(node->right);
            
        
    



/*****************************************************************************
* @date   2020/4/19
* @brief  水平画树
* @param  node	二叉树节点
* @param  left	判断左右
* @param  str 	可变字符串
*****************************************************************************/
void draw_level(TreeNode* root, bool left, char* str) 
    TreeNode* node=root;
    if (node->right) 
        draw_level(node->right, false, strcat(str, (left ? "|     " : "      ")));
    

    printf("%s", str);
    printf("%c", (left ? '\\\\' : '/'));
    printf("-----");
    printf("%c\\n", node->data);

    if (node->left) 
        draw_level(node->left, true, strcat(str, (left ? "      " : "|     ")));
    
    //  "      " : "|     " 长度为 6
    str[strlen(str) - 6] = '\\0';
    fflush(stdout); //清空输出流


/*****************************************************************************
* @date   2020/4/19
* @brief  根节点画树
* @param  root	二叉树根节点
*****************************************************************************/
void draw(TreeNode* BT) 
    char str[STR_SIZE];
    memset(str, '\\0', STR_SIZE);
    TreeNode* root_left=BT;
    TreeNode* root_right=BT;

    /**
     * 1. 在 windows 下,下面是可执行的
     * 2. 在 Linux   下,执行会报 Segmentation fault
     *      需要使用中间变量
     */
    if (root_right->right) 
        draw_level(root_right->right, false, str);
    
    if(BT!=NULL)
    
        printf("%c\\n", BT->data);
    
    if (root_left->left) 
        draw_level(root_left->left, true, str);
    


//https://blog.csdn.net/weixin_42109012/article/details/92250160
int main()

    // 例子: ABDH###E##CF##G##
    //AB#D#E##CF##G##
    //AB#D#E##CF##G#HI####
    TreeNode* BT;
    printf("请输入字符串:");
    char* str = (char*)malloc(sizeof(char) * STR_SIZE);
    scanf("%s", str);
    if (strlen(str) == createBTNode(&BT, str, 0)) 
        printf("二叉树建立成功\\n");
    
    draw(BT);

    printf("\\n先序遍历结果:");
    preOrder(BT);

    printf("\\n中序遍历结果:");
    inOrder(BT);

    printf("\\n后序遍历结果:");
    postOrder(BT);

    printf("\\n层序遍历结果:");
    levelOrder(BT);

    printf("\\n定制层序遍历结果:");
    levelOrder_getFirst(BT);

    return 0;





以上是关于二叉树之前序/中序/后序和层次遍历的主要内容,如果未能解决你的问题,请参考以下文章

二叉树之前序/中序/后序和层次遍历

二叉树之前序中序后序和层次遍历图文教程

二叉树遍历的递归实现(先序中序后序和层次遍历)

A 1020 Tree Traversals (25分) 题型: 二叉树的遍历 之 由后序和中序得到层次遍历

建立二叉树的二叉链表表示,实现二叉树的先序、中序、后序和按层次遍历,统计并输出结点个数。

树——二叉树的先序中序和后序遍历