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. windows服务与log4net应用

    有时候我们需要用到window服务来执行定时任务,然后配合log4net记录程序运行情况,这里简单记录下配置的整个过程以及注意要点: 一.添加windows服务 1.设计页面,右键添加安装程序

  2. 关于一些JS的运算符

    首先呢,什么是JavaScript:JavaScript是一种脚本语言,也是一种解释型语言,更是一种由数据值决定变量类型的弱类型语言 JavaScript主要由三部分组成 ECMAScript  这个 ...

  3. property配置

    之前把设备历史数据存储的时间周期存储在了数据库中,因为以下一些原因,我打算改写到property配置文件中 1.这个周期时间的配置没有单独放一个tabel中,导致现在设备类型越来越多,每次添加或者修改 ...

  4. java EE,java Web中的400,404,405等各种错误介绍

    4 请求失败4xx 4xx应答定义了特定服务器响应的请求失败的情况.客户端不应当在不更改请求的情况下重新尝试同一个请求.(例如,增加合适的认证信息).不过,同一个请求交给不同服务器也许就会成功. 4. ...

  5. Ubuntu系统---WeChat安装

    Ubuntu安装微信教程 工具/原料 ubuntu 14.04 x86 方法/步骤 这次我用的系统是Ubuntu 14.04 x86,在网上先去下载electronic-wechat-linux ht ...

  6. java面试知识记录

    1.数据库 (1)数据库优化      面试求职:数据库常见面试题(数据库优化思路) 数据库优化方案整理 (2)数据库的事务 MySQL——事务(Transaction)详解 MySQL 事务 2.设 ...

  7. Mac&Appium&Python自动化测试-Appium安装

    基础配置 1.JAVA和Git就不用多说了 2.Brew,也就是homebrew,它是MacOSX上的软件包管理工具,它就等同于linux上的apt-get.yum,如果没有安装,可以通过如下命令安装 ...

  8. jwt、token

    什么是JWT jwt是一段密文;然而密码是如何产生的? 密码是由三个部分生成: 1.JWT头:JWT头部分是一个描述JWT元数据的JSON对象:{"alg":"hash2 ...

  9. vue-cli3.0 环境变量与模式

    vue-cli3.0移除了配置文件目录: config和build文件夹.可以说是非常的精简了,那移除了配置文件目录后如何自定义配置环境变量和模式呢? 为什么需要配置环境变量和模式呢? 所有方法肯定是 ...

  10. solr 分面搜索(转载)

    原文地址:http://blog.csdn.net/bingduanlbd/article/details/52199347 分面搜索(Faceting)基于索引词项对搜索结果进行分类,同时返回每个分 ...