C++编写数据结构中的二叉树(前序,中序,后序遍历)

本文介绍了如何使用C++语言创建一个二叉搜索树,并实现前序、中序和后序遍历算法。通过实例演示了如何在树中插入节点、遍历树结构以获取有序数据。

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

编译环境xCode 5.1

Two.h:

#ifndef __OK__Two__
#define __OK__Two__

#include <iostream>
typedef struct List{
    char name[20];
    char desc[200];
    int num;
    List *next;
}List;


typedef struct myTree{
    int data;
    char stu_name[20];
    char desc[200];
    int num;
    myTree *lChild;
    myTree *rChild;
}tree;


class listtree {
    
public:
    void createTree(int,int[],char*[]);
    void preOrder(tree *);//前序遍历
    void inOrder(tree *);//中序遍历
    void postOrder(tree *);//后序遍历
    myTree *rootNode;
};


#endif /* defined(__OK__Two__) */

Two.cpp

#include "Two.h"
void listtree::createTree(int count,int num[],char *names[]){
    int index = count;
    tree *currentNode = NULL;
    while (index) {
        tree *node = new tree;
        int id = count-index;
        node->data = num[id];
        strcpy(node->stu_name, names[id]);
        node->lChild = NULL;
        node->rChild = NULL;
        if (rootNode==NULL) {
            rootNode = node;
            
        }else{
            currentNode = rootNode;
            tree *thisNode = NULL;
            while (currentNode!=NULL) {
                thisNode = currentNode;
                if (currentNode->data>node->data) {
                    currentNode = currentNode->lChild;
                }else {
                    currentNode = currentNode->rChild;
                }
            }
            if(node->data>thisNode->data){
                thisNode->rChild = node;
            }else{
                thisNode->lChild = node;
            }
            currentNode = node;
        }
        index--;
    }
}
void listtree::preOrder(tree *node){
    if (node==NULL) {
        return;
    }
    std::cout<<node->data<<"++"<<node->stu_name<<"++"<<"\n";
    preOrder(node->lChild);
    preOrder(node->rChild);
}
void listtree::inOrder(tree *node){
    if (node==NULL) {
        return;
    }
    inOrder(node->lChild);
    std::cout<<node->data<<"++"<<node->stu_name<<"++"<<"\n";
    inOrder(node->rChild);
}
void listtree::postOrder(tree *node){
    if (node==NULL) {
        return;
    }
    postOrder(node->lChild);
    postOrder(node->rChild);
    std::cout<<node->data<<"++"<<node->stu_name<<"++"<<"\n";
}


<think>我们将在C++中实现二叉树前序、中后序遍历。我们将定义一个二叉树节点的结构体,然后实现三种递归遍历方式。此外,我们还会提供一个简单的二叉树构建示例(例如手动构建)来测试遍历函数。根据引用[1][2][3]中提供的递归算法示例,我们可以写出类似的递归遍历函数。由于用户要求在VS2010中实现,我们使用C++语言(因为引用的代码是C++)并确保代码在该环境下可以编译运行。步骤:1.定义二叉树节点结构体(BiNode),包含数据域和左右孩子指针。2.实现先、中后序遍历的递归函数。3.构建一个二叉树用于测试(这里我们手动构建一个简单的二叉树)。4.编写主函数,依次调用三种遍历函数,输出遍历结果。注意:引用的代码中有一些细节需要注意,比如递归终止条件(节点为空时返回),以及访问节点的操作(这里我们简单地打印节点数据)。我们参考引用[3]中的示例二叉树:先遍历结果为ABDECF。我们构建这个二叉树二叉树示例:A/\BC//DF\E实际上,引用[3]中描述的先遍历结果为:ABDECF,所以我们构建如下:A/\BC//DF\E但是注意,这个的构建需要正确指定左右孩子。另外,我们使用字符作为节点数据。代码结构如下:1.包含头文件(iostream,stack等,但递归遍历不需要栈,非递归才需要,这里我们只实现递归版本,非递归版本在引用[4]中,但用户没有要求非递归,因此我们只实现递归。但根据问题,用户要求三种遍历,且引用中也有递归示例,因此我们写递归的即可)。2.定义节点结构体。3.创建节点函数(为了方便构建二叉树)。4.实现遍历函数:PreOrder(先),InOrder(中),PostOrder(后序)。5.主函数:构建二叉树,调用遍历函数。注意:由于用户要求VS2010,我们使用控制台应用程。我们按照上述步骤编写代码。</think> 以下是在Visual Studio 2010中使用C++实现二叉树三种遍历方式的完整解决方案: ### 1. 二叉树节点结构定义 ```cpp struct TreeNode { char data; TreeNode* left; TreeNode* right; TreeNode(char val) : data(val), left(nullptr), right(nullptr) {} }; ``` ### 2. 递归遍历实现 ```cpp // 先遍历 (根->左->右) void PreOrder(TreeNode* root) { if (root) { std::cout << root->data << " "; // 访问根节点 PreOrder(root->left); PreOrder(root->right); } } // 中遍历 (左->根->右) void InOrder(TreeNode* root) { if (root) { InOrder(root->left); std::cout << root->data << " "; // 访问根节点 InOrder(root->right); } } // 后序遍历 (左->右->根) void PostOrder(TreeNode* root) { if (root) { PostOrder(root->left); PostOrder(root->right); std::cout << root->data << " "; // 访问根节点 } } ``` ### 3. 完整可运行示例 ```cpp #include <iostream> // 二叉树节点定义 (同上) // 遍历函数实现 (同上) int main() { // 构建示例二叉树: A(B(D,E),C(,F)) // A // / \ // B C // / \ \ // D E F TreeNode* root = new TreeNode('A'); root->left = new TreeNode('B'); root->right = new TreeNode('C'); root->left->left = new TreeNode('D'); root->left->right = new TreeNode('E'); root->right->right = new TreeNode('F'); // 执行遍历 std::cout << "先遍历: "; PreOrder(root); // 输出: A B D E C F std::cout << "\n中遍历: "; InOrder(root); // 输出: D B E A C F std::cout << "\n后序遍历: "; PostOrder(root); // 输出: D E B F C A // 清理内存 // 实际项目中需实现完整的析构函数 return 0; } ``` ### 4. 在VS2010中的操作步骤 1. 创建新项目:文件 → 新建 → 项目 → Visual C++ → Win32控制台应用程 2. 命名项目(如"BinaryTreeTraversal") 3. 在"应用程设置"中选择"空项目" 4. 右键源文件 → 添加 → 新建项 → C++文件(命名如"main.cpp") 5. 粘贴上述代码 6. 按F5编译运行 ### 非递归实现参考 使用栈实现非递归遍历(参考引用[4]): ```cpp #include <stack> void IterativePreOrder(TreeNode* root) { std::stack<TreeNode*> s; TreeNode* current = root; while (current || !s.empty()) { while (current) { std::cout << current->data << " "; s.push(current); current = current->left; } current = s.top(); s.pop(); current = current->right; } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值