二叉搜索树的实现及指针问题的一点思考(C++)
今天实现二叉搜索树的时候因为指针的问题卡了一上午(实在不应该。。。),一直segmentation fault,个人感觉还是需要记录一下的。
首先贴一下做的题的意思:
输入一系列整数,建立二叉排序数,并进行前序,中序,后序遍历。(jobdu 1201)
题目很简单,就是基本的二叉树的建立,最后代码如下
#include<iostream>
#include<cstdio>
using namespace std;
class node{
public:
int val;
node* left;
node* right;
node(int v=){
val=v;
left=NULL;
right=NULL;
}
};
node* Search(node* root ,int tar)
{
node* p=root;
node* pre=NULL;
while(p!=NULL){
pre=p;
if(p->val>tar){
p=p->left;
}
else if(p->val<tar){
p=p->right;
}
else{
return NULL;
}
}
return pre;
}
void Insert(node** root,int tar)
{
node* p=*root;
if(*root==NULL){
*root=new node(tar);
return ;
}
node* ans=Search(*root,tar);
if(ans!=NULL){
if(ans->val<tar){
ans->right=new node(tar);
}
else{
ans->left=new node(tar);
}
}
}
void ilr(node* root)
{
node *p=root;
if(p!=NULL){
cout<<root->val<<" ";
ilr(root->left);
ilr(root->right);
}
}
void lir(node* root)
{
node *p=root;
if(p!=NULL){
lir(root->left);
cout<<root->val<<" ";
lir(root->right);
}
}
void lri(node* root)
{
node *p=root;
if(p!=NULL){
lri(root->left);
lri(root->right);
cout<<root->val<<" ";
}
}
void deletetree (node* root){
node * p = root;
if (p != NULL){
deletetree (p->left);
deletetree (p->right);
delete (p);
}
}
int main()
{
//freopen("t","r",stdin);
int n;
while(cin>>n){
node* root=NULL;
for(int i=;i<n;i++){
int x;
cin>>x;
Insert(&root,x);
//cout<<root->val<<endl;
}
ilr(root);
cout<<endl;
lir(root);
cout<<endl;
lri(root);
cout<<endl;
deletetree(root);
}
return ;
}
代码有几个问题还是很有必要注意的:
一、关于指针的初始化问题,记得看过某本书说过虽然有的编译器会对各种不同的数据类型进行初始化,但是我们还是自己干这个比较保险,这次因为太久没碰指针忘了这条忠告,终于是记起来了。
二、并不是说传入指针就能达到同步的更新,开始一直没注意到这个问题。这次的insert函数中因为传入了一个根节点的指针,以为这样的更改两边就可以同步了,但是最后发现怎么也插不进值了。。。其实所谓的使用指针可以达到同步更新作用实际上是两边对同一个东西操作,但是这里只是传入指针就不行了,所以这里需要指针的指针。
三、所谓的segmentation fault很大情况下是因为内存操作的原因,也就是说指针可能指到了错误的内存中去了。所以遇到这个错误你就要尤其小心你的指针操作,这时候借助一些调试工具可能更方便。
二叉搜索树的实现及指针问题的一点思考(C++)的更多相关文章
- 剑指offer26:将二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
1 题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 2 思路和方法 在二叉搜索树中,每个结点都有两个分别指向其左.右子树的 ...
- [LeetCode题解]109. 有序链表转换二叉搜索树 | 快慢指针 + 递归
题目描述 给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: 给定的有序链表: ...
- PAT 天梯赛 是否同一棵二叉搜索树 (25分)(二叉搜索树 指针)
给定一个插入序列就可以唯一确定一棵二叉搜索树.然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到.例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树,都得到一样的结果 ...
- [数据结构]——二叉树(Binary Tree)、二叉搜索树(Binary Search Tree)及其衍生算法
二叉树(Binary Tree)是最简单的树形数据结构,然而却十分精妙.其衍生出各种算法,以致于占据了数据结构的半壁江山.STL中大名顶顶的关联容器--集合(set).映射(map)便是使用二叉树实现 ...
- [LeetCode] Convert Sorted List to Binary Search Tree 将有序链表转为二叉搜索树
Given a singly linked list where elements are sorted in ascending order, convert it to a height bala ...
- [LeetCode] Recover Binary Search Tree 复原二叉搜索树
Two elements of a binary search tree (BST) are swapped by mistake. Recover the tree without changing ...
- 剑指Offer面试题:22.二叉搜索树的后序遍历序列
一.题目:二叉搜索树的后序遍历序列 题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则返回true,否则返回false.假设输入的数组的任意两个数字都互不相同. 例如在下面 ...
- 剑指Offer面试题:25.二叉搜索树与双向链表
一.题目:二叉搜索树与双向链表 题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向.比如输入下图中左边的二叉搜索树,则输出转换之后的 ...
- PAT树_层序遍历叶节点、中序建树后序输出、AVL树的根、二叉树路径存在性判定、奇妙的完全二叉搜索树、最小堆路径、文件路由
03-树1. List Leaves (25) Given a tree, you are supposed to list all the leaves in the order of top do ...
随机推荐
- Python 列表元素排重uniq
# -*- coding: gbk -*- def uniq(ls): lsCopy=[e for e in ls] for i in xrange(1,len(ls)): for j in xran ...
- 阿里云ecs云服务器安装wdcp控制面板教程
以前就听说服务器非常的难,而且我也不懂代码,不懂英文,我怕自己学不会就买了一个月的.开始我都不知道啥样的服务器,还是我的一位哥们给我远程买的,他说这个镜像最稳定了. 服务器买好后我便开始研究,可是怎么 ...
- linux上进程状态查询
linux上进程有5种状态: 1. 运行(正在运行或在运行队列中等待) 2. 中断(休眠中, 受阻, 在等待某个条件的形成或接受到信号) 3. 不可中断(收到信号不唤醒和不可运行, 进程必须等待直到有 ...
- wireshark 和 Httpwatch tcpdump
wireshark 功能强大,适用性高.过滤功能好. Httpwatch 功能单一,优缺点明显,但是非常适合抓取http交互的包,而且可以非常明确的显示出整个的交互过程. tcpdump linux ...
- jq隐藏页面的一行
<script type="text/javascript" src="http://files.cnblogs.com/914556495wxkj/jquery- ...
- Python模块常用的几种安装方式
Python模块安装方法 一.方法1: 单文件模块直接把文件拷贝到 $python_dir/Lib 二.方法2: 多文件模块,带setup.py 下载模块包,进行解压,进入模块文件夹,执行:pytho ...
- mysql开启binlog
mysql开启binlog,至于为什么要开启binlog,可以google下. ## 设置server_id,一般设置为IP server_id= ## 复制过滤:需要备份的数据库名,多个库以逗号分隔 ...
- Delphi xe5 手机开发经验(新手级别)
Delphi xe5 手机开发经验(新手级别) http://diybbs.zol.com.cn/1/34037_699.html http://www.delphitop.com/html/jiqi ...
- ACM/ICPC 之 平面几何-两直线关系(POJ 1269)
题意:给定四点的坐标(x,y),分别确定两直线,求出其交点,若重合or平行则输出相应信息 用四个点的坐标算出直线通式(ax+by+c=0)中的a,b,c,然后利用a,b,c计算出交点坐标(其他公式不够 ...
- SQL Server的“错误:9004”
客户的一台现场采集电脑崩溃,无法启动.用PE引导后,将MDF和LDF数据复制出来,往正常的数据库附加时,报如下错误: 处理数据库 'databasename' 的日志时出错.如果可能,请从备份还原.如 ...