数据结构-用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] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? / ...
随机推荐
- git merge 命令的使用
我们把dev分支的工作成果合并到master分支上: $ git merge dev Updating d46f35e..b17d20e Fast-forward readme.txt | 1 + 1 ...
- ssh下known_hosts的作用
原文地址:http://blog.csdn.net/yasaken/article/details/7348441 在平时工作中,有时候需要SSH登陆到别的Linux主机上去,但有时候SSH登陆会被禁 ...
- cmd设置电脑自动关机
cmd设置电脑自动关机 设置:(3600代表一小时,单位s) shutdown -s -t 3600 取消 shutdown -a
- jQuery获取的dom对象和原生的dom对象有何区别
js原生获取的dom是一个对象,jQuery对象就是一个数组对象,其实就是选择出来的元素的数组集合,所以说他们两者是不同的对象类型不等价 原生DOM对象转jQuery对象 var box = docu ...
- 看一下我学习linux的过程
学习Linux的最佳方法是将它用于日常工作. 阅读Linux书籍,观看Linux视频不仅仅是足够的. 学习Linux没有捷径可走. 你不可能在一夜之间在Linux中掌握. 这需要时间和持久性. 刚刚潜 ...
- linux基础4-压缩及其相关的命令
一 压缩的原理以及gzip.bzip2.tar三个命令的: Linux下文件的压缩与打包 二 zip.zipinfo.unzip: zip:压缩成.zip文件 zipinfo:列出压缩文件信息
- 使用iframe框架时,实现子页面内跳转到整个页面,而不是在子页面内跳转
首先先来描述一下我所遇到的问题,我在一个首页的index.jsp页面中用到了iframe框架,见下图 在iframe中引入jsp页面的路径,是几个iframe框架组合成的一个完整的页面,但是他们的存在 ...
- Python3学习笔记37-LeetCode刷题
LeetCode中国官网一个用来刷编程题的网站,收录了很多面试题.感觉还是学习到很多.记录一下思路.代码还是要多敲. 建议编写完后直接在LeetCode上运行和提交.提交时会有不同的测试用例来测试代码 ...
- Spring入门篇——第2章 Spring IOC容器
第2章 Spring IOC容器 介绍Spring IOC容器的基本概念和应用 2-1 IOC及Bean容器 自己的理解:什么是IOC?就是利用配置文件(外部容器)来创建对象. 在IOC容器中,所有对 ...
- LaTeX新人使用教程[转载]
LaTeX新人教程,30分钟从完全陌生到基本入门 by Nan 对于真心渴望迅速上手LaTeX的人,前言部分可以跳过不看. 本教程面向对LaTeX完全无认知无基础的新人.旨在让新人能够用最简单快捷的方 ...