[C++ implements binary tree traversal]

1. The structure of the binary tree

insert image description here

Second, the traversal method of the binary tree

  1. Preorder traversal: root –> left –> right
  2. Inorder traversal: left –> root –> right
  3. Post-order traversal: left –> right –> root
  4. Hierarchy traversal: top layer –> bottom layer

3. Source code

Note: For the implementation of the pre-order, in-order and post-order traversal algorithms in the binary tree, only the recursive method is used for the time being, and the non-recursive implementation method will be supplemented later.

/*
    本项目主要用于二叉树的基础遍历算法测试。
    1.binarytree.h包含对二叉树的结构体定义以及二叉树的先序、中序、后序以及层次遍历。
    2.binarytree.cpp包含对各个遍历算法的实现。
    3.main.cpp包含了对于二叉树遍历算法的测试。
*/

binarytree.h

#ifndef BINARYTREE_H
#define BINARYTREE_H

#include <QObject>

// 二叉树结点定义
struct TreeNode {
    
    
    int data;
    TreeNode* left;
    TreeNode* right;

    TreeNode(int val) : data(val), left(nullptr), right(nullptr) {
    
    }
};

// 二叉树类
class BinaryTree : public QObject{
    
    
    Q_OBJECT
public:
    TreeNode* root;

    int seq;

public:
    BinaryTree();
    /* 二叉树节点插入 */
    void insertNode(int val);
    /* 初始化二叉树 */
    void initBinaryTree();
    /* 二叉树先序遍历 */
    void preOrderTravel(TreeNode* node);
    /* 二叉树中序遍历 */
    void inOrderTravel(TreeNode* node);
    /* 二叉树后序遍历 */
    void postOrderTravel(TreeNode* node);
    /* 二叉树层次遍历 */
    void levelOrderTravel();
};

#endif // BINARYTREE_H

binarytree.cpp

#include "binarytree.h"
#include <iostream>
#include <queue>

using namespace  std;

BinaryTree::BinaryTree()
{
    
    
    root = nullptr;
    seq = 0;
}
// 插入结点
void BinaryTree::insertNode(int val) {
    
    
    TreeNode* newNode = new TreeNode(val);

    if (root == nullptr) {
    
    
        root = newNode;
        return;
    }

    TreeNode* curr = root;
    while (true) {
    
    
        if (val < curr->data) {
    
    
            if (curr->left == nullptr) {
    
    
                curr->left = newNode;
                break;
            } else {
    
    
                curr = curr->left;
            }
        } else {
    
    
            if (curr->right == nullptr) {
    
    
                curr->right = newNode;
                break;
            } else {
    
    
                curr = curr->right;
            }
        }
    }
}

void BinaryTree::initBinaryTree()
{
    
    
    int _data[7] = {
    
    4,2,6,1,3,5,7};
    cout<<"初始化节点序列:";
    for(int i = 0;i < 7;i ++)
    {
    
    
        insertNode(_data[i]);
        cout<<_data[i]<<" ";
    }
    cout<<endl;
}

void BinaryTree::preOrderTravel(TreeNode *node)
{
    
    
    if (node == nullptr)
        return;
    cout<<"第"<<seq++<<"个节点:"<<node->data<<endl;

    if(node->left != nullptr)
        preOrderTravel(node->left);

    if(node->right != nullptr)
        preOrderTravel(node->right);
}

void BinaryTree::inOrderTravel(TreeNode *node)
{
    
    
    if (node == nullptr)
        return;
    if(node->left != nullptr)
        inOrderTravel(node->left);

    cout<<"第"<<seq++<<"个节点:"<<node->data<<endl;

    if(node->right != nullptr)
        inOrderTravel(node->right);
}

void BinaryTree::postOrderTravel(TreeNode *node)
{
    
    
    if (node == nullptr)
        return;
    if(node->left != nullptr)
        postOrderTravel(node->left);

    if(node->right != nullptr)
        postOrderTravel(node->right);

    cout<<"第"<<seq++<<"个节点:"<<node->data<<endl;
}

void BinaryTree::levelOrderTravel()
{
    
    
    if (root == nullptr)
        return;
    queue<TreeNode*> _q;
    _q.push(root);

    while(!_q.empty())
    {
    
    
        TreeNode* child = _q.front();
        cout<<"第"<<seq++<<"个节点:"<<child->data<<endl;
        _q.pop();
        if(child->left != nullptr)
            _q.push(child->left);

        if(child->right != nullptr)
            _q.push(child->right);

    }
    cout<<endl;
}

main.cpp

#include <QCoreApplication>
#include <iostream>
#include <binarytree.h>

using namespace std;

int main(int argc, char *argv[])
{
    
    
    QCoreApplication a(argc, argv);
    BinaryTree *mTree = new BinaryTree;

    cout<<"开始初始化二叉树!"<<endl;
    mTree->initBinaryTree();//初始化二叉树

    cout<<"开始执行二叉树的先序遍历!"<<endl;
    mTree->preOrderTravel(mTree->root);
    mTree->seq = 0;

    cout<<"开始执行二叉树的中序遍历!"<<endl;
    mTree->inOrderTravel(mTree->root);
    mTree->seq = 0;

    cout<<"开始执行二叉树的后序遍历!"<<endl;
    mTree->postOrderTravel(mTree->root);
    mTree->seq = 0;

    cout<<"开始执行二叉树的层次遍历!"<<endl;
    mTree->levelOrderTravel();

    delete mTree;
    mTree = nullptr;
    return a.exec();
}

The effect is as follows:
insert image description here

Guess you like

Origin blog.csdn.net/wddkxg/article/details/131465786