二叉搜索树的实现及指针问题的一点思考(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 ...
随机推荐
- 数论v2
#include <cmath> #include <cstdio> #include <cstring> #include <algorithm> # ...
- ODATA 云驱动 http://www.cdata.com/cloud/
ODATA 云驱动 http://www.cdata.com/cloud/ 目前支持:ORACLE.MS SQL . MYSQL. -------------- rssbus ht ...
- 【leetcode】Path Sum II
Path Sum II Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals ...
- stream的seek方法实例
using (FileStream outStream = new FileStream(@"D:\12.txt", FileMode.Open)) { using (FileSt ...
- codeforces 490C. Hacking Cypher 解题报告
题目链接:http://codeforces.com/problemset/problem/490/C 题目意思:给出一个可能有10^6 位长的字符串且没有前导0的整数,问能否一分为二,使得前面的一部 ...
- css 优先级 机制
多重样式(Multiple Styles):如果外部样式.内部样式和内联样式同时应用于同一个元素,就是使多重样式的情况. 一般情况下,优先级如下: (外部样式)External style sheet ...
- jquery 中的一写常用方法
$('form').submit(); // 表单提交 window.parent.location.reload(); // 子窗口刷新父页面 window.location.reload(); / ...
- 【leetcode】Surrounded Regions(middle)☆
Given a 2D board containing 'X' and 'O', capture all regions surrounded by 'X'. A region is captured ...
- 【linux】学习5
鸟哥那本书第11章的内容 管理整个计算机硬件的是操作系统的内核(kernel),内核是需要保护的,我们一般用户只能通过shell来跟内核通信.Shell是用户操作系统的接口 cat /etc/pas ...
- LINQ查询返回DataTable类型
个人感觉Linq实用灵活性很大,参考一篇大牛的文章LINQ查询返回DataTable类型 http://xuzhihong1987.blog.163.com/blog/static/267315872 ...