大话数据结构之二叉树c++实现

二叉树

参考大话数据结构和B站up主码农论坛

file BinaryTree.h

#pragma once
#include <iostream>
using namespace std;

typedef struct BiTNode
{
    char data;
    struct BiTNode *lchild;
    struct BiTNode *rchild;
}BiTNode, *BiTree;

 手工构造一个如下结构的二叉树。
//             1
//          /     \
//         2       3
//        / \     /
//       4   5   6
//      / \ / \
//     7  8 9  0

class BinaryTree
{
public:
    BinaryTree();
    ~BinaryTree(void);

    void ArtificalTree(BiTree *pTT);
    void ArtificalTree(BiTree &TT);

    // 二叉树层次遍历。
    void LevelOrder();
    
    // 非递归
    void PreOrder();
    void InOrder();
    void PostOrder();

    // 递归
    void PreOrderRecur();
    void InOrderRecur();
    void PostOrderRecur();
    void PreOrderRecurProcess(BiTree TT);
    void InOrderRecurProcess(BiTree TT);
    void PostOrderRecurProcess(BiTree TT);

private:
    BiTree m_BinTree;
};


file BinaryTree.cpp

/*
    // 手工构造一个如下结构的二叉树。
             1
          /     \
         2       3
        / \     /
       4   5   6
      / \ / \
     7  8 9  0
*/

#include "BinaryTree.h"
#include <queue>
#include <stack>

BinaryTree::BinaryTree():m_BinTree(nullptr)
{
    ArtificalTree(m_BinTree);
}

BinaryTree::~BinaryTree(void)
{
}

void BinaryTree::ArtificalTree(BiTree *pTT) // xxx
{
    BiTNode* head = new BiTNode;

    head->data = '1';
    head->lchild = head->rchild = nullptr;

    head->lchild = new BiTNode;
    head->rchild = new BiTNode;
    head->lchild->data = '2';
    head->lchild->lchild = head->lchild->rchild = nullptr;
    head->rchild->data = '3';
    head->rchild->lchild = nullptr;
    head->rchild->rchild = nullptr;

    head->lchild->lchild = new BiTNode;
    head->lchild->rchild = new BiTNode;
    head->rchild->lchild = new BiTNode;
    head->lchild->lchild->data = '4';
    head->lchild->lchild->lchild = nullptr;
    head->lchild->lchild->rchild = nullptr;
    head->lchild->rchild->data = '5';
    head->lchild->rchild->lchild = nullptr;
    head->lchild->rchild->rchild = nullptr;
    head->rchild->lchild->data = '6';
    head->rchild->lchild->lchild = nullptr;
    head->rchild->lchild->rchild = nullptr;

    head->lchild->lchild->lchild = new BiTNode;
    head->lchild->lchild->rchild = new BiTNode;
    head->lchild->rchild->lchild = new BiTNode;
    head->lchild->rchild->rchild = new BiTNode;
    head->lchild->lchild->lchild->data = '7';
    head->lchild->lchild->lchild->lchild = nullptr;
    head->lchild->lchild->lchild->rchild = nullptr;
    head->lchild->lchild->rchild->data = '8';
    head->lchild->lchild->rchild->lchild = nullptr;
    head->lchild->lchild->rchild->rchild = nullptr;
    head->lchild->rchild->lchild->data = '9';
    head->lchild->rchild->lchild->lchild = nullptr;
    head->lchild->rchild->lchild->rchild = nullptr;
    head->lchild->rchild->rchild->data = '0';
    head->lchild->rchild->rchild->lchild = nullptr;
    head->lchild->rchild->rchild->rchild = nullptr;

    *pTT = head; // xxx
}

void BinaryTree::ArtificalTree(BiTree &TT) // xxx
{
    BiTNode* head = new BiTNode;

    head->data = '1';
    head->lchild = head->rchild = nullptr;

    head->lchild = new BiTNode;
    head->rchild = new BiTNode;
    head->lchild->data = '2';
    head->lchild->lchild = head->lchild->rchild = nullptr;
    head->rchild->data = '3';
    head->rchild->lchild = nullptr;
    head->rchild->rchild = nullptr;

    head->lchild->lchild = new BiTNode;
    head->lchild->rchild = new BiTNode;
    head->rchild->lchild = new BiTNode;
    head->lchild->lchild->data = '4';
    head->lchild->lchild->lchild = nullptr;
    head->lchild->lchild->rchild = nullptr;
    head->lchild->rchild->data = '5';
    head->lchild->rchild->lchild = nullptr;
    head->lchild->rchild->rchild = nullptr;
    head->rchild->lchild->data = '6';
    head->rchild->lchild->lchild = nullptr;
    head->rchild->lchild->rchild = nullptr;

    head->lchild->lchild->lchild = new BiTNode;
    head->lchild->lchild->rchild = new BiTNode;
    head->lchild->rchild->lchild = new BiTNode;
    head->lchild->rchild->rchild = new BiTNode;
    head->lchild->lchild->lchild->data = '7';
    head->lchild->lchild->lchild->lchild = nullptr;
    head->lchild->lchild->lchild->rchild = nullptr;
    head->lchild->lchild->rchild->data = '8';
    head->lchild->lchild->rchild->lchild = nullptr;
    head->lchild->lchild->rchild->rchild = nullptr;
    head->lchild->rchild->lchild->data = '9';
    head->lchild->rchild->lchild->lchild = nullptr;
    head->lchild->rchild->lchild->rchild = nullptr;
    head->lchild->rchild->rchild->data = '0';
    head->lchild->rchild->rchild->lchild = nullptr;
    head->lchild->rchild->rchild->rchild = nullptr;

    TT = head; // xxx
}

void BinaryTree::LevelOrder()
{
    queue<BiTree> qq; 
    qq.push(m_BinTree);

    while (!qq.empty())
    {
        cout << qq.front()->data << " ";
        BiTNode *tmp = qq.front();
        qq.pop();

        if (tmp->lchild != nullptr) qq.push(tmp->lchild);
        if (tmp->rchild != nullptr) qq.push(tmp->rchild);
    }
    return;
}

void BinaryTree::PreOrder()
{
    stack<BiTree> ss; 
    BiTNode *tmp = m_BinTree;   

    while ( (tmp!=NULL) || (!ss.empty()) )
    {
        if (tmp!=NULL)
        {
            cout << tmp->data << " ";   // 入栈前访问。
            ss.push(tmp);               // 入栈。
            tmp=tmp->lchild;            // 继续处理左子树。
        }
        else
        {
            BiTNode *ee = ss.top();
            ss.pop();                   // 出栈。
            tmp=ee->rchild;             // 处理右子树。 
        }
    }
    return;
}

void BinaryTree::InOrder()
{
    stack<BiTree> ss; 
    BiTNode *tmp = m_BinTree;   

    while ( (tmp!=NULL) || (!ss.empty()) )
    {
        if (tmp!=NULL)
        {
            ss.push(tmp);               // 入栈。
            tmp=tmp->lchild;            // 继续处理左子树。
        }
        else
        {
            BiTNode *ee = ss.top();
            ss.pop();                   // 出栈。
            cout << ee->data << " ";          
            tmp=ee->rchild;             // 处理右子树。 
        }
    }
    return;
}

void BinaryTree::PostOrder()
{
    stack<BiTree> ss;
    BiTNode *ee = m_BinTree;  
  
    BiTNode *pp=NULL; // 最近访问过的结点。

    while ( (ee!=NULL) || (!ss.empty()) )
    {
        if (ee!=NULL)    // 从根结点开始,沿树的左结点,依次入栈,直到左结点为空。
        {
            ss.push(ee);
            ee=ee->lchild;
        }
        else   // 转向右。
        {
            // 读取栈顶元素,不出栈。
            ee = ss.top();     

            // 如果右子树存在并且没有被访问过。
            if ( (ee->rchild!=NULL) && (ee->rchild!=pp) )
            {
                ee=ee->rchild;  // 转向右。
                ss.push(ee);  // 右子树的根结点入栈。
                ee=ee->lchild;  // 再转向右子树的左结点。
            }
            else  
            {
                ss.pop();  // 将结点弹出。
                cout << ee->data << " ";     // 访问结点。
                pp=ee;         // 记下最近访问过的结点。
                ee=NULL;       // 结点访问完后,重置ee为空,继续读取栈顶元素。
            }
        }
    }
}

void BinaryTree::PreOrderRecur()
{
    PreOrderRecurProcess(m_BinTree);
}
void BinaryTree::PreOrderRecurProcess(BiTree TT)
{
    if (TT == nullptr) return;

    cout << TT->data << " ";
    PreOrderRecurProcess(TT->lchild);
    PreOrderRecurProcess(TT->rchild);
}

void BinaryTree::InOrderRecur()
{
    InOrderRecurProcess(m_BinTree);
}
void BinaryTree::InOrderRecurProcess(BiTree TT)
{
    if (TT == nullptr) return;

    InOrderRecurProcess(TT->lchild);
    cout << TT->data << " ";
    InOrderRecurProcess(TT->rchild);
}

void BinaryTree::PostOrderRecur()
{
    PostOrderRecurProcess(m_BinTree);
}
void BinaryTree::PostOrderRecurProcess(BiTree TT)
{
    if (TT == nullptr) return;

    PostOrderRecurProcess(TT->lchild);
    PostOrderRecurProcess(TT->rchild);
    cout << TT->data << " ";
}

file main.cpp

#include <queue>
#include <stack>
#include "BinaryTree.h"

void myPrint(char *strInfo)
{
    cout << "\n" << strInfo << "..." << endl;
}

int main()
{  
    BinaryTree myBiTree;
    myPrint("层序遍历"); myBiTree.LevelOrder();
    myPrint("先序遍历"); myBiTree.PreOrder();
    myPrint("先序遍历递归版"); myBiTree.PreOrderRecur();
    myPrint("中序遍历"); myBiTree.InOrder();
    myPrint("中序遍历递归版"); myBiTree.InOrderRecur();
    myPrint("后序遍历"); myBiTree.PostOrder();
    myPrint("后序遍历递归版"); myBiTree.PostOrderRecur();

    cout << endl;
    system("pause");
    return 0;
}
五级标题
六级标题
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以回答你关于数据结构实验6的问题。C++实现二叉树类的具体实现如下: ```cpp #include <iostream> using namespace std; // 节点结构体 struct TreeNode { int val; TreeNode* left; TreeNode* right; TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} }; // 二叉树类 class BinaryTree { public: BinaryTree() : root(nullptr) {} // 插入节点 void insert(int val) { if (root == nullptr) { root = new TreeNode(val); return; } TreeNode* cur = root; while (cur != nullptr) { if (val < cur->val) { if (cur->left == nullptr) { cur->left = new TreeNode(val); return; } cur = cur->left; } else { if (cur->right == nullptr) { cur->right = new TreeNode(val); return; } cur = cur->right; } } } // 查找节点 bool find(int val) { TreeNode* cur = root; while (cur != nullptr) { if (cur->val == val) { return true; } else if (cur->val > val) { cur = cur->left; } else { cur = cur->right; } } return false; } // 删除节点 void remove(int val) { root = removeNode(root, val); } // 中序遍历 void inorder() { inorderTraversal(root); } private: // 根节点 TreeNode* root; // 删除节点 TreeNode* removeNode(TreeNode* root, int val) { if (root == nullptr) return root; if (val < root->val) { root->left = removeNode(root->left, val); } else if (val > root->val) { root->right = removeNode(root->right, val); } else { if (root->left == nullptr) { TreeNode* rightChild = root->right; delete root; return rightChild; } else if (root->right == nullptr) { TreeNode* leftChild = root->left; delete root; return leftChild; } else { TreeNode* minNode = findMin(root->right); root->val = minNode->val; root->right = removeNode(root->right, minNode->val); } } return root; } // 查找最小节点 TreeNode* findMin(TreeNode* root) { while (root->left != nullptr) { root = root->left; } return root; } // 中序遍历 void inorderTraversal(TreeNode* root) { if (root == nullptr) return; inorderTraversal(root->left); cout << root->val << " "; inorderTraversal(root->right); } }; ``` 以上是基本的二叉树实现,包括了插入节点、查找节点、删除节点和中序遍历等操作。你可以根据需要进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值