数据结构-用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] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? / ...
随机推荐
- OneinStack – 一键PHP/JAVA安装工具
https://oneinstack.com/ OneinStack包含以下组合:lnmp(Linux + Nginx+ MySQL+ PHP) lamp(Linux + Apache+ MySQL+ ...
- 【php设计模式】模板模式
定义一个操作中算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变算法的结构即可重定义该算法的某些特定步骤. 通俗点的理解就是 :完成一件事情,有固定的数个步骤,但是每个步骤根据对象的不同 ...
- VS Code 运行 JavaScript 文件时出现“node...”乱码或错误
1.错误图片: 2.如果是中文乱码的话,可以到设置里边把「Auto Guess Encoding」这一项勾起来. 3.如果不是这个原因,可能是因为没安装 Node.js 和配置 Node.js 环境, ...
- canvas学习之初级运用
<html> <head> <meta charset=utf-8> <title>绘制简单图形</title> <style typ ...
- 【Distributed】CDN
一.概述 1.1 Web前端优化 1.2 DNS域名解析过程 1.3 传统方式请求静态资源 二.CDN内容分发 2.1 什么是CDN 2.2 CDN内容分发原理 2.3 阿里云环境实战搭建CDN内容分 ...
- Hadoop_23_MapReduce倒排索引实现
1.1.倒排索引 根据属性的值来查找记录.这种索引表中的每一项都包括一个属性值和具有该属性值的各记录的地址.由于不是由记录来确 定属性值,而是由属性值来确定记录的位置,因而称为倒排索引(invert ...
- 05_Redis_List命令
一:Redis 列表(List) -- LinkedList Redis列表是简单的字符串列表,按照插入顺序排序.你可以添加一个元素到列表的头部(左边)或者尾部(右边):一个列表最多可以包含 232 ...
- 桌面Ubuntu卡死解决方案
通常情况下,我们用桌面Ubuntu会遇到卡住的的情况,我们一般会进行强制关机处理,但其实还有另一种操作,不用强制关机. 切换到tty模式,执行命令pkill X;start X;就能重新进入桌面,不用 ...
- 数据库 Redis:Windows环境安装
1. 下载 Redis (1)前往 GitHub 下载:https://github.com/microsoftarchive/redis (2)点击 release : (3)选择好版本号后,下载文 ...
- Java中的super的使用