数据结构-用C++实现一个二叉树,递归方法中序遍历
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++实现一个二叉树,递归方法中序遍历的更多相关文章
- 数据结构与算法(c++)——查找二叉树与中序遍历
查找树ADT--查找二叉树 定义:对于树中的每个节点X,它的左子树中的所有项的值小于X中的项,而它的右子树中所有项的值大于X中的项. 现在给出字段和方法定义(BinarySearchTree.h) # ...
- 数据结构《10》----二叉树 Morris 中序遍历
无论是二叉树的中序遍历还是用 stack 模拟递归, 都需要 O(n)的空间复杂度. Morris 遍历是一种 常数空间 的遍历方法,其本质是 线索二叉树(Threaded Binary Tree), ...
- LeetCode 94:二叉树的中序遍历 Binary Tree Inorder Traversal
题目: 给定一个二叉树,返回它的中序 遍历. Given a binary tree, return the inorder traversal of its nodes' values. 示例: 输 ...
- [LeetCode] Binary Tree Inorder Traversal 二叉树的中序遍历
Given a binary tree, return the inorder traversal of its nodes' values. For example:Given binary tre ...
- LeetCode(94):二叉树的中序遍历
Medium! 题目描述: 给定一个二叉树,返回它的中序 遍历. 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,3,2] 进阶: 递归算法很简单,你可以通过迭代算法完成吗 ...
- 【LeetCode题解】94_二叉树的中序遍历
目录 [LeetCode题解]94_二叉树的中序遍历 描述 方法一:递归 Java 代码 Python代码 方法二:非递归 Java 代码 Python 代码 [LeetCode题解]94_二叉树的中 ...
- LeetCode 94. 二叉树的中序遍历(Binary Tree Inorder Traversal)
94. 二叉树的中序遍历 94. Binary Tree Inorder Traversal 题目描述 给定一个二叉树,返回它的 中序 遍历. LeetCode94. Binary Tree Inor ...
- Leetcode题目94.二叉树的中序遍历(中等)
题目描述: 给定一个二叉树,返回它的中序遍历. 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,3,2] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? 思路解析: 1 ...
- leecode刷题(29)-- 二叉树的中序遍历
leecode刷题(29)-- 二叉树的中序遍历 二叉树的中序遍历 给定一个二叉树,返回它的中序 遍历. 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,3,2] 思路 跟 ...
- Java实现 LeetCode 94 二叉树的中序遍历
94. 二叉树的中序遍历 给定一个二叉树,返回它的中序 遍历. 示例: 输入: [1,null,2,3] 1 2 / 3 输出: [1,3,2] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? / ...
随机推荐
- js将阿拉伯数字转换成汉字大写
适用场景:票据,结算凭证等.将任意数字的金额,转换成汉字大写的形式.例如:1234.50 -> 壹仟贰佰叁拾肆圆伍角.壹.贰.叁.肆 直接贴代码,如下: //阿拉伯数字转换成大写汉字 funct ...
- Android opengl 笔记
1. varying vec2 vTextureCoord; 不能用in vec2 ,varying 表示在vs 和 fs中都可见. 2. android 里面 0 和1 都要打小数点 比如0.0 1 ...
- 解决 VS Code「Code Runner」插件运行 python 时的中文乱码问题
描述 这里整理了两种 VS Code「Code Runner」插件运行 python 时乱码的解决方案.至于设置「Auto Guess Encoding」为 true 的操作这里就不多描述了. 乱码截 ...
- asp.net mvc4 学习1
1 简介:微软在很早就看到了基于windows系统的web开发平台的需求,这时便开始提出自己的解决方案即微软的第一个基于web开发的平台ASP.再后来随着需求和性能的要求再2002年推出第二个解决方案 ...
- CentOS系统 Amoeba+MySql主从读写分离配置 适合新手傻瓜式教程!-----仅供参考!
废话不说,直接开始: 一.安装mysql的三种方式,这里采用第2种(安装方式不再详解,请参照) http://www.cnblogs.com/babywaa/articles/4837946.html ...
- CDH5.16.1的kafka集群报错: No broker in ISR for partition [getngo_collect_apm_test,0]
1 详细错误 kafka.common.NoReplicaOnlineException: No broker in ISR for partition [getngo_collect_apm_tes ...
- [SHOI2013]阶乘字符串
题目描述 给定一个由前\(n\)个小写字母组成的串\(S\). 串\(S\)是阶乘字符串当且仅当前\(n\)个小写字母的全排列(共\(n!\)种)都作为\(S\)的子序列(可以不连续)出现. 由这个定 ...
- ansible模块-user
一.概述user 模块可以帮助我们管理远程主机上的用户,比如创建用户.修改用户.删除用户.为用户创建密钥对等操作.二.心得password参数:此参数用于指定用户的密码.但是这个密码不能是明文的密码, ...
- 记一次 解决 vue 兼容ie11 的问题
vue2.0 最近项目需要做到兼容ie11,找问题找半天,于是各种百度, 发现引入 babel-polyfill 还是有问题 空白页面 参考它的配置 ( 最后一句代码为引入的资源路径 ) 我跟他差 ...
- 包 ,模块(time、datetime、random、hashlib、typing、requests、re)
目录 1. 包 1. 优先掌握 2. 了解 3. datetime模块 1. 优先掌握 4. random模块 1. 优先掌握 2. 了解 5. hashlib模块和hmac模块 6. typing模 ...