构建遍历的二叉排序树算法,前序遍历中序遍历后序遍历

一、指针

       指针是一种编程概念,用于存储变量的内存地址;通过指针,程序能够直接访问和操作内存中的数据。

  1. 声明指针:声明一个指针变量,例如在C语言中,声明一个指向整数的指针 int *ptr;
  2. 指针赋值:将变量的地址赋给指针,例如 ptr = &variable;,其中 & 是取地址符,用来获取变量的内存地址。
  3. 空指针:指针可以初始化为 NULL(或在C++中为 nullptr),表示它不指向任何有效的内存地址。
  4. 指针错误:指针的错误使用可能导致程序崩溃或数据损坏,如野指针、内存泄漏等。
#include <stdio.h>

//using namespace std;
int main()
{
	int var = 10;
	int* ptr;
	ptr = &var;
	if (ptr == nullptr)
	{
		fprintf(stderr, "错误:输出的指针是空指针\n");//错误流
		return 1;
	}
	printf("Value of var: %d\n", var);
	printf("Value pointed to by ptr : %d\n", *ptr);
	return 0;
}

二、二叉树

       在二叉树中,每个节点最多有两个子树,通常称为左子树和右子树。二叉树的节点通常包含一个数据元素以及两个指向其子树的链接(可能是空)。

1.二叉树类型:

  • 满二叉树:所有层都被完全填满,每个节点都有0个或2个子节点。
  • 完全二叉树:除了最后一层外,每一层都被完全填满,并且所有节点都向左对齐。
  • 平衡二叉树:任何两个叶子节点的深度之差不超过1。
  • 二叉搜索树(Binary Search Tree, BST):对于树中的每个节点,其左子树中的所有项都小于该节点,其右子树中的所有项都大于该节点。

2.二叉树遍历:按照某种规则访问树中的每个节点的过程

  • 前序遍历:访问根节点 -> 遍历左子树 -> 遍历右子树
  • 中序遍历:遍历左子树 -> 访问根节点 -> 遍历右子树
  • 后序遍历:遍历左子树 -> 遍历右子树 -> 访问根节点

3.二叉树的实现

#include <stdio.h>
#include<iostream>

using namespace std;

struct TreeNode
{
	int value;           // 节点存储的值
	TreeNode *left;       // 指向左子节点的指针
	TreeNode *right;      // 指向右子节点的指针

	// 构造函数,用于创建一个包含特定值的TreeNode对象
	// 并且初始化左右子节点指针为nullptr
	TreeNode(int x) :value(x), left(nullptr), right(nullptr) {}  
};

int main()
{
	TreeNode root(10);//节点值
	//创建左节点
	TreeNode leftchild(6);
	root.left = &leftchild;
	//创建右节点
	TreeNode rightchild(12);
	root.right = &rightchild;
	//访问
	cout << "roof value:" << root.value << endl;
	cout << "left child value:" << root.left->value << endl;
	cout << "right child value:" << root.right->value << endl;
}

三、构造算法逻辑图

四、代码

#include <iostream>
#include <vector>

using namespace std;

struct TreeNode {
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};

// 插入新节点到二叉排序树
TreeNode* insert(TreeNode* root, int val) {
    if (root == nullptr) {
        return new TreeNode(val);
    }
    if (val < root->val) {
        root->left = insert(root->left, val);
    }
    else if (val > root->val) { // 确保如果val已经存在于树中,它将被插入在正确的位置
        root->right = insert(root->right, val);
    }
    // 返回未修改的节点指针
    return root;
}

// 前序遍历
void preorderTraversal(TreeNode* root) {
    if (root != nullptr) {
        cout << root->val << " ";
        preorderTraversal(root->left);
        preorderTraversal(root->right);
    }
}

// 中序遍历
void inorderTraversal(TreeNode* root) {
    if (root != nullptr) {
        inorderTraversal(root->left);
        cout << root->val << " ";
        inorderTraversal(root->right);
    }
}

// 后序遍历
void postorderTraversal(TreeNode* root) {
    if (root != nullptr) {
        postorderTraversal(root->left);
        postorderTraversal(root->right);
        cout << root->val << " ";
    }
}
int main() {
    vector<int> values = { 20, 10, 30, 5, 15, 25, 35 };
    TreeNode* root = nullptr;

    for (int val : values) {
        root = insert(root, val);
    }

    cout << "前序遍历: ";
    preorderTraversal(root);
    cout << endl;

    cout << "中序遍历: ";
    inorderTraversal(root);
    cout << endl;

    cout << "后序遍历: ";
    postorderTraversal(root);
    cout << endl;

    return 0;
}

五、运行结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值