1:二叉排序树,又称二叉树。其定义为:二叉排序树或者空树,或者是满足如下性质的二叉树。

(1)若它的左子树非空,则左子树上所有节点的值均小于根节点的值。

(2)若它的右子树非空,则右子树上所有节点的值均大于根节点的值。

(3)左、右子树本身又各是一颗二叉排序树。

上述性质简称二叉排序树性质(BST性质),故二叉排序树实际上是满足BST性质的二叉树。

2:代码如下:

#include "stdafx.h"
#include<malloc.h>
#include <iostream>
#include <assert.h>
using namespace std; //定义节点类
class Node
{
public:
int data;//数据
Node *parent;//父亲节点
Node *left;//左子节点
Node *right;//右子节点
public:
Node() :data(-), parent(NULL), left(NULL), right(NULL) {};
Node(int num) :data(num), parent(NULL), left(NULL), right(NULL) {};
}; //二叉排序树类定义
class Tree
{
public:
Tree(int num[], int len);//插入num数组的前len个数据
void insertNode1(int data);//插入节点,递归方法
void insertNode(int data);//插入节点,非递归方法
//Node *searchNode(int data);//查找节点,递归方法
void deleteNode(int data);//删除节点及其子树,递归方法
void InOrderTree();//中序遍历,递归方法
void InOrderTree(Node* current);//用于中序遍历,递归方法
void PreOrderTreeUnRec();//中序遍历,非递归方法
private:
void insertNode(Node* current, int data);//递归插入方法
Node *searchNode(Node* current, int data);//递归查找方法
void deleteNode(Node* current);
private:
Node* root;//二叉树的根节点
}; //插入num数组的前len个数据
Tree::Tree(int num[], int len)
{
root = new Node(num[]);//建立root节点,为num[0]分配一个地址
//把数组中的其他数组插入到二叉树中
for (int i = ; i < len; i++)
{
//insertNode(num[i]);
insertNode1(num[i]);
}
} //插入数据为参数data的节点,非递归方法
void Tree::insertNode1(int data)//插入节点
{
Node *p, *par;//p用于遍历节点,par用于保存节点
Node *newNode = new Node(data);//创建节点
p = par = root;
while (p != NULL)//查找插入在哪个节点下面
{
par = p;//保存节点
if (data > p->data)//如果data大于当前节点的data,下一步到左子节点,否则进行到右子节点
p = p->right;
else if (data < p->data)
p = p->left;
else if (data == p->data)//不能插入重复数据
{
delete newNode;
return;
}
}
newNode->parent = par;
if (par->data > newNode->data)//把新节点插入在目标节点的正确位置
par->left = newNode;
else
par->right = newNode;
} //插入数据为参数data的节点,调用递归插入方法
void Tree::insertNode(int data)
{
if (root != NULL)
{
insertNode(root, data);//调用递归插入方法
}
} //递归插入方法
void Tree::insertNode(Node * current, int data)
{
//如果data小于当前节点数据,则在当前节点的左子树插入
if (data < current->data)
{
if (current->left == NULL)//如果左节点不存在,则插入到左节点
{
current->left = new Node(data);
current->left->parent = current;
}
else
insertNode(current->left, data);//否则对左节点进行递归调用
}
//如果data大于当前节点数据,则在当前节点的右子树插入
else if (data > current->data)
{
if (current->right == NULL)//如果右节点不存在,则插入到右节点
{
current->right = new Node(data);
current->right->parent = current;
}
else
insertNode(current->right, data);//否则对右节点进行递归调用
}
return;//data等于当前节点数据时,不插入
} //递归查找方法
Node *Tree::searchNode(Node* current, int data)
{
//如果data小于当前节点数据,则递归搜索左子树
if (data < current->data)
{
if (current->left == NULL)//如果不存在左子树,则返回NULL
return NULL;
return searchNode(current->left, data);
}
//如果data大于当前节点数据,则递归搜索右子树
else if (data > current->data)
{
if (current->right == NULL)//如果不存在右子树,则返回NULL
return NULL;
return searchNode(current->right, data);
}
//如果相等,则返回current
return current;
} //删除数据为data的节点及其子树
void Tree::deleteNode(int data)
{
Node *current = NULL;
//current = searchNode(data);//查找节点
current = searchNode(current,data);//查找节点
if (current != NULL)
{
//deleteNode(current);
deleteNode(data);
}
} //删除current节点及其子树的所有节点
void Tree::deleteNode(Node *current)
{
if (current->left != NULL)//删除左子树
{
deleteNode(current->left);
}
if (current->right != NULL)//删除右子树
{
deleteNode(current->left);
}
if (current->parent == NULL)//如果current是根节点,把root置空
{
delete current;
root = NULL;
return;
}
//将current父亲节点的相应指针置空
if (current->parent->data > current->data)//current为其父节点的左子节点
current->parent->left = NULL;
else//current为parNode的右子节点
current->parent->right = NULL;
//最后删除此节点
delete current; } //中序遍历,递归方法
void Tree::InOrderTree()
{
if (root == NULL)
return;
InOrderTree(root);
}
//用于中序遍历
void Tree::InOrderTree(Node* current)
{
if (current != NULL)
{
InOrderTree(current->left);//遍历左子树
cout << current->data << " ";
InOrderTree(current->right);//遍历右子树
}
} int main()
{
Node m_node();
cout << "节点类的数据为:"<<m_node.data << endl;
int num[] = { ,,,,,,, };
Tree tree(num, );
cout << "InOrder:" << endl;
tree.InOrderTree();//中序遍历,递归方法
return ;
}

数据结构-用C++实现一个二叉树,递归方法中序遍历的更多相关文章

  1. 数据结构与算法(c++)——查找二叉树与中序遍历

    查找树ADT--查找二叉树 定义:对于树中的每个节点X,它的左子树中的所有项的值小于X中的项,而它的右子树中所有项的值大于X中的项. 现在给出字段和方法定义(BinarySearchTree.h) # ...

  2. 数据结构《10》----二叉树 Morris 中序遍历

    无论是二叉树的中序遍历还是用 stack 模拟递归, 都需要 O(n)的空间复杂度. Morris 遍历是一种 常数空间 的遍历方法,其本质是 线索二叉树(Threaded Binary Tree), ...

  3. LeetCode 94:二叉树的中序遍历 Binary Tree Inorder Traversal

    题目: 给定一个二叉树,返回它的中序 遍历. Given a binary tree, return the inorder traversal of its nodes' values. 示例: 输 ...

  4. [LeetCode] Binary Tree Inorder Traversal 二叉树的中序遍历

    Given a binary tree, return the inorder traversal of its nodes' values. For example:Given binary tre ...

  5. LeetCode(94):二叉树的中序遍历

    Medium! 题目描述: 给定一个二叉树,返回它的中序 遍历. 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,3,2] 进阶: 递归算法很简单,你可以通过迭代算法完成吗 ...

  6. 【LeetCode题解】94_二叉树的中序遍历

    目录 [LeetCode题解]94_二叉树的中序遍历 描述 方法一:递归 Java 代码 Python代码 方法二:非递归 Java 代码 Python 代码 [LeetCode题解]94_二叉树的中 ...

  7. LeetCode 94. 二叉树的中序遍历(Binary Tree Inorder Traversal)

    94. 二叉树的中序遍历 94. Binary Tree Inorder Traversal 题目描述 给定一个二叉树,返回它的 中序 遍历. LeetCode94. Binary Tree Inor ...

  8. Leetcode题目94.二叉树的中序遍历(中等)

    题目描述: 给定一个二叉树,返回它的中序遍历. 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,3,2] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? 思路解析: 1 ...

  9. leecode刷题(29)-- 二叉树的中序遍历

    leecode刷题(29)-- 二叉树的中序遍历 二叉树的中序遍历 给定一个二叉树,返回它的中序 遍历. 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,3,2] 思路 跟 ...

  10. Java实现 LeetCode 94 二叉树的中序遍历

    94. 二叉树的中序遍历 给定一个二叉树,返回它的中序 遍历. 示例: 输入: [1,null,2,3] 1 2 / 3 输出: [1,3,2] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? / ...

随机推荐

  1. js的一些兼容融性问题

    1.非行内样式获取 高级浏览器 getComputedStyle(obox.false)//获取所有属性 ie浏览器 box.currentStyle//获取所有属性 兼容写法 function ge ...

  2. vue中使用svg字体图标

    1.在src/ 下面新建目录icons,里面新建文件夹svg,和文件index.js .svg用于存放从iconfont下载下来的svg格式的图标,index.js用于引入使用到svg文件和对应的组件 ...

  3. 如何在Marketing Cloud里创建extension field扩展字段

    首先在Marketing Cloud里找到创建扩展字段的tile入口,搜索关键字extension: 这会进入Fiori应用"Custom fields",能看到系统里所有创建好的 ...

  4. SAP云平台里Global Account和Sub Account的关系

    在Cloud Foundry环境里,一个Global Account或者Trial Account能够创建多个SubAccount,如图: 创建好的新的subaccount: 一旦subaccount ...

  5. Oracle权限管理详解(1)

    详见:https://www.cnblogs.com/yw0219/p/5855210.html Oracle 权限 权限允许用户访问属于其它用户的对象或执行程序,ORACLE系统提供三种权限:Obj ...

  6. linux 下安装python2.7.13

    1.下载所必要的依赖包 yum -y install python-devel openssl openssl-devel gcc sqlite sqlite-devel mysql-devel li ...

  7. Python学习记录6-list、tuple、dict、set复习

    数据类型在一门语言中是非常重要的,所以选择再次学习一下加深记忆.本次主要参考了大神廖雪峰的官方网站,非常感谢大神,讲的很清晰,收获很大. 标准数据类型 Number(数字) String(字符串) L ...

  8. 如何处理不能新建word、excel、PPT的情况?

    Office系列办公软件是大家都非常喜欢使用的软件,但是有些朋友反映在使用电脑时,在桌面右键菜单新建选项里没有Word.Excel或PPT,非常的耽误工作. 下面就为大家介绍一下桌面右键菜单新建选项里 ...

  9. 07_Redis_Sorted Set命令

    一:Redis 有序集合(sorted set):有序set集合,专门用来做排行榜 Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员 ------- (有序不重复) 不 ...

  10. JDBC连接数据库报错:Loading class `com.mysql.jdbc.Driver'. This is deprecated.

    使用JDBC连接数据库时出现报错, 报错内容:Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver cla ...