今天实现二叉搜索树的时候因为指针的问题卡了一上午(实在不应该。。。),一直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++)的更多相关文章

  1. 剑指offer26:将二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。

    1 题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 2 思路和方法 在二叉搜索树中,每个结点都有两个分别指向其左.右子树的 ...

  2. [LeetCode题解]109. 有序链表转换二叉搜索树 | 快慢指针 + 递归

    题目描述 给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: 给定的有序链表: ...

  3. PAT 天梯赛 是否同一棵二叉搜索树   (25分)(二叉搜索树 指针)

    给定一个插入序列就可以唯一确定一棵二叉搜索树.然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到.例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树,都得到一样的结果 ...

  4. [数据结构]——二叉树(Binary Tree)、二叉搜索树(Binary Search Tree)及其衍生算法

    二叉树(Binary Tree)是最简单的树形数据结构,然而却十分精妙.其衍生出各种算法,以致于占据了数据结构的半壁江山.STL中大名顶顶的关联容器--集合(set).映射(map)便是使用二叉树实现 ...

  5. [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 ...

  6. [LeetCode] Recover Binary Search Tree 复原二叉搜索树

    Two elements of a binary search tree (BST) are swapped by mistake. Recover the tree without changing ...

  7. 剑指Offer面试题:22.二叉搜索树的后序遍历序列

    一.题目:二叉搜索树的后序遍历序列 题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则返回true,否则返回false.假设输入的数组的任意两个数字都互不相同. 例如在下面 ...

  8. 剑指Offer面试题:25.二叉搜索树与双向链表

    一.题目:二叉搜索树与双向链表 题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向.比如输入下图中左边的二叉搜索树,则输出转换之后的 ...

  9. PAT树_层序遍历叶节点、中序建树后序输出、AVL树的根、二叉树路径存在性判定、奇妙的完全二叉搜索树、最小堆路径、文件路由

    03-树1. List Leaves (25) Given a tree, you are supposed to list all the leaves in the order of top do ...

随机推荐

  1. iOS开发之loadView和viewDidLoad总结

    http://www.1000phone.net/forum.php?mod=viewthread&tid=10507&extra=page%3D1%26filter%3Dauthor ...

  2. 【Storage】Ubuntu LVM 安装配置

    参考资料: https://www.centos.bz/2012/02/installation-and-usage-of-lvm/ http://blog.chinaunix.net/uid-206 ...

  3. Angularjs与bootstrap.datetimepicker结合实现日期选择器

    http://www.lovelucy.info/angularjs-best-practices.html http://damoqiongqiu.iteye.com/blog/1917971 ht ...

  4. pip安装简单方法

    前提:有网络 wget -c --no-check-certificate https://bootstrap.pypa.io/get-pip.py python get-pip.py

  5. 11. javacript高级程序设计-DOM扩展

    1. DOM扩展 1.1 选择符API l querySelector() 接收一个css选择符,返回与该模式匹配的第一个元素 l querySelectorAll() 接收一个css选择符,返回所有 ...

  6. C# Winform中如何获取文件名与文件路径

    获取文件名方法: 用System.IO.Path.GetFileName和System.IO.Path.GetFileNameWithoutExtension(无扩展名)的方法 获取文件路径方法: / ...

  7. Apache OFBiz 研究记录01

    作为Apache 的顶级项目: Apache OFBiz,功能十分强大,一般开发者很难用到全部功能. 这次笔者的研究主要集中在电子商务平台这一块,一步一步解构. OFBiz下载地址:http://of ...

  8. ABAP ole方式对EXCEL进行操作

    DATA: excel    TYPE ole2_object,       workbook TYPE ole2_object,       sheet    TYPE ole2_object,   ...

  9. Effective C++ -----条款08: 别让异常逃离析构函数

    析构函数绝对不要吐出异常.如果一个被析构函数调用的函数可能抛出异常,析构函数应该捕捉任何异常,然后吞下它们(不传播)或结束程序. 如果客户需要对某个操作函数运行期间抛出的异常作出反应,那么class应 ...

  10. NEFU 505 超级红与黑 (高斯消元)

    题目链接 中文题,改下模板构造一下就能过了,数据有点水,不过还是需要自由变元枚举的. #include <iostream> #include <cstdio> #includ ...