二叉树遍历(层次遍历)(前中后序遍历)(C++实现)

二叉树遍历(层次遍历)(前中后序遍历)(C++实现)

实现代码

/*
author : eclipse
email  : [email protected]
time   : Mon Apr 20 16:02:40 2020
*/
#include<bits/stdc++.h>
using namespace std;

struct Node {
    int data;
    Node *left;
    Node *right;
    Node(int value, Node *l, Node *r) : data(value), left(l), right(r) {}
};

Node* create() {
    int value;
    if (!~scanf("%d", &value)) {
        return NULL;
    }
    Node* root = new Node(value, NULL, NULL);
    queue<Node*> q;
    q.push(root);
    while (~scanf("%d", &value)) {
        q.front()->left = new Node(value, NULL, NULL);
        q.push(q.front()->left);
        if (~scanf("%d", &value)) {
            q.front()->right = new Node(value, NULL, NULL);
            q.push(q.front()->right);
        } else {
            break;
        }
        q.pop();
    }
    return root;
}

void levelTraverse(Node *root) {
    queue<Node*> q;
    q.push(root);
    while (!q.empty()) {
        printf("%-5d ", q.front()->data);
        if (q.front()->left) {
            q.push(q.front()->left);
        }
        if (q.front()->right) {
            q.push(q.front()->right);
        }
        q.pop();
    }
}

void preOrderTraverse(Node *p) {
    if (!p) {
        return;
    }
    printf("%-5d ", p->data);
    preOrderTraverse(p->left);
    preOrderTraverse(p->right);
}

void inOrderTraverse(Node *p) {
    if (!p) {
        return;
    }
    inOrderTraverse(p->left);
    printf("%-5d ", p->data);
    inOrderTraverse(p->right);
}

void postOrderTraverse(Node *p) {
    if (!p) {
        return;
    }
    postOrderTraverse(p->left);
    postOrderTraverse(p->right);
    printf("%-5d ", p->data);
}

int main(int argc, char const *argv[])
{
    Node* root = create();
    levelTraverse(root);
    printf("\n");
    preOrderTraverse(root);
    printf("\n");
    inOrderTraverse(root);
    printf("\n");
    postOrderTraverse(root);
    printf("\n");
    return 0;
}

算法思路

  • 层序遍历
    类似图的BFS,借助队列,初始时,将根节点指针入队,进入循环,打印队首元素对应data值,将队首元素的左右孩子节点入队(若存在),队首出队,若当前节点为该层最后一个节点,则出队后队首节点为下一层第一个节点,否则为出队节点的右兄弟节点,一直循环上述过程直到队列为空。创建二叉树时的算法也为层序插入,与上述遍历算法相似再次不再赘述。
  • 前序遍历
    利用递归的方式,先访问当前子树的根节点,再递归地访问当前子树的左子树和右子树,初始时根节点为整个二叉树的根节点,然后递归地访问左子树、右子树,一直递归直到遍历结束,遇到左子树或右子树为空则return
  • 中序遍历
    利用递归的方式,先访问当前子树的左子树,再递归地访问当前子树的根节点和右子树,初始时根节点为整个二叉树的根节点的左子树,然后递归地访问根节点和右子树,一直递归直到遍历结束,遇到左子树或右子树为空则return
  • 后序遍历
    利用递归的方式,先递归地访问当前子树的左子树和右子树,再递归地访问当前根节点,一直递归直到遍历结束,遇到左子树或右子树为空则return
  • 前中后序遍历
    前中后序遍历的“前”、“中”、“后”是相对当前子树的根节点而言的

样例图解

测试数据

1 2 3 4 5 6 7 8 9 10

输出结果

1     2     3     4     5     6     7     8     9     10
1     2     4     8     9     5     10    3     6     7
8     4     9     2     10    5     1     6     3     7
8     9     4     10    5     2     6     7     3     1

最后

  • 由于博主水平有限,不免有疏漏之处,欢迎读者随时批评指正,以免造成不必要的误解!
发布了39 篇原创文章 · 获赞 25 · 访问量 3377

猜你喜欢

转载自blog.csdn.net/qq_44486439/article/details/105640851