二叉搜索树的实现及指针问题的一点思考(C++)

今天实现二叉搜索树的时候因为指针的问题卡了一上午(实在不应该。。。),一直segmentation
fault,个人感觉还是需要记录一下的。

首先贴一下做的题的意思:

输入一系列整数,建立二叉排序数,并进行前序,中序,后序遍历。(jobdu
1201)

题目很简单,就是基本的二叉树的建立,最后代码如下


  1 #include<iostream>
2 #include<cstdio>
3 using namespace std;
4 class node{
5 public:
6 int val;
7 node* left;
8 node* right;
9 node(int v=0){
10 val=v;
11 left=NULL;
12 right=NULL;
13 }
14 };
15 node* Search(node* root ,int tar)
16 {
17 node* p=root;
18 node* pre=NULL;
19 while(p!=NULL){
20 pre=p;
21 if(p->val>tar){
22 p=p->left;
23 }
24 else if(p->val<tar){
25 p=p->right;
26 }
27 else{
28 return NULL;
29 }
30 }
31 return pre;
32 }
33 void Insert(node** root,int tar)
34 {
35 node* p=*root;
36 if(*root==NULL){
37 *root=new node(tar);
38 return ;
39 }
40 node* ans=Search(*root,tar);
41 if(ans!=NULL){
42 if(ans->val<tar){
43 ans->right=new node(tar);
44 }
45 else{
46 ans->left=new node(tar);
47 }
48 }
49 }
50 void ilr(node* root)
51 {
52 node *p=root;
53 if(p!=NULL){
54 cout<<root->val<<" ";
55 ilr(root->left);
56 ilr(root->right);
57 }
58 }
59 void lir(node* root)
60 {
61 node *p=root;
62 if(p!=NULL){
63 lir(root->left);
64 cout<<root->val<<" ";
65 lir(root->right);
66 }
67 }
68 void lri(node* root)
69 {
70 node *p=root;
71 if(p!=NULL){
72 lri(root->left);
73 lri(root->right);
74 cout<<root->val<<" ";
75 }
76 }
77 void deletetree (node* root){
78 node * p = root;
79 if (p != NULL){
80 deletetree (p->left);
81 deletetree (p->right);
82 delete (p);
83 }
84 }
85 int main()
86 {
87 //freopen("t","r",stdin);
88 int n;
89 while(cin>>n){
90 node* root=NULL;
91 for(int i=0;i<n;i++){
92 int x;
93 cin>>x;
94 Insert(&root,x);
95 //cout<<root->val<<endl;
96 }
97 ilr(root);
98 cout<<endl;
99 lir(root);
100 cout<<endl;
101 lri(root);
102 cout<<endl;
103 deletetree(root);
104 }
105 return 0;
106 }

代码有几个问题还是很有必要注意的:

一、关于指针的初始化问题,记得看过某本书说过虽然有的编译器会对各种不同的数据类型进行初始化,但是我们还是自己干这个比较保险,这次因为太久没碰指针忘了这条忠告,终于是记起来了。

二、并不是说传入指针就能达到同步的更新,开始一直没注意到这个问题。这次的insert函数中因为传入了一个根节点的指针,以为这样的更改两边就可以同步了,但是最后发现怎么也插不进值了。。。其实所谓的使用指针可以达到同步更新作用实际上是两边对同一个东西操作,但是这里只是传入指针就不行了,所以这里需要指针的指针。

三、所谓的segmentation
fault很大情况下是因为内存操作的原因,也就是说指针可能指到了错误的内存中去了。所以遇到这个错误你就要尤其小心你的指针操作,这时候借助一些调试工具可能更方便。

时间: 2024-08-14 09:20:47

二叉搜索树的实现及指针问题的一点思考(C++)的相关文章

二叉搜索树(搜索二叉树)转换成一个双向链表

1.题目描述: 将一个二叉搜索树转换成一个双向链表: 2.二叉搜索树,直接看图: 如图就是一个二叉搜索树的模型,也就是转换函数的入口数据,也是下边函数中即将用到的例子,既然有输入,肯定有输出,先面在看一张图(第三条): 3.输入输出模型: 右边就是最终的输出结果,5后边是空,下边来分析一下: 1.在二叉搜索树中,每个节点都有两个孩子,即左和右,而在双向链表中,每个节点也有两个指针,前驱和后继指针,二叉树和双向链表很有相似性: 2.改变二叉搜索树的左右孩子指针指向,就可完成二叉搜索树到双向链表的转

二叉搜索树变成有序双向链表,要求不能创建新的结点,只调整指针的指向

二叉搜索树的结点有2个指针,分别指向左右孩子,双链表的每个结点也有2个指针,分别指向前后结点,所以在不创建新结点,只调整指针指向时可以将二叉搜索树变成双向链表:又由于二叉搜索树在中序遍历时是有序的,所以可以采用中序处理二叉搜索树调整指针指向将其变成有序双向链表.为了简化指针移动操作,我们让左孩子为前向指针,右孩子为后向指针. 二叉搜索树的最左结点即使整个树中最小的结点,所以首先找到最左结点,它就是链表的首结点,链表最后一个结点初始化为空.中序遍历时,当前结点的左孩子指向链表的最后一个结点,若最后

剑指offer:二叉搜索树与双向链表

1.题目描述: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 2.解题思路: (1)将左子树构造成双向链表,并返回链表头节点: (2)定位左子树双链表的尾节点: (3)如果左子树链表不为空,将当前root连缀其链尾: (4)将右子树构造出双向链表,并返回链表头节点: (5)如果右子树链表不为空,将当前root连缀其表头: (6)根据左子树链表是否为空,确定返回的节点. 3.JavaScript实现: function Conv

Java数据结构之二叉搜索树

Java数据结构之二叉搜索树 1.二叉搜索树组成 二叉搜索树又称为二叉排序树,它或者是一颗空树,或者是一颗具有如下特性的非空二叉树,需要满足一下三个条件: (1)若它的左子树非空,则左子树上所有结点的关键字均小于根结点的关键字: (2)若它的右子树非空,则右子树上所有结点的关键字均大于(可以等于)根结点的关键字. (3)左子树右子树本身又各是一颗二叉搜索树 在算法描述中,均以结点值的比较来代表其关键字的比较,因为若结点的值为类类型时,该类必须实现系统提供的java.lang.comparable

二叉搜索树与双向链表

void convertNode(BSTreeNode *root, BSTreeNode ** pLastNodeInList) { if(!root) return ; if(root->left) { convertNode(root->left, pLastNodeInList); } root->left = *pLastNodeInList; if(*pLastNodeInList != NULL) (*pLastNodeInList)->right = root; *

算法导论第十二章 二叉搜索树

一.二叉搜索树概览 二叉搜索树(又名二叉查找树.二叉排序树)是一种可提供良好搜寻效率的树形结构,支持动态集合操作,所谓动态集合操作,就是Search.Maximum.Minimum.Insert.Delete等操作,二叉搜索树可以保证这些操作在对数时间内完成.当然,在最坏情况下,即所有节点形成一种链式树结构,则需要O(n)时间.这就说明,针对这些动态集合操作,二叉搜索树还有改进的空间,即确保最坏情况下所有操作在对数时间内完成.这样的改进结构有AVL(Adelson-Velskii-Landis)

二叉搜索树&mdash;&mdash;算法导论(14)

1. 什么是二叉搜索树     顾名思义,二叉搜索树是以一棵二叉搜索树来组织的.如下图,这样的一棵树可以使用一个链表数据结构来表示,其中的每一个节点是一个对象.除了key和卫星数据之外,每个节点还包含属性left(左孩子).right(右孩子).和p(双亲)(若不存在,则值为NIL).     二叉搜索树中的关键字总是以满足二叉搜索树性质的方式存储: 设x是二叉搜索树的一个节点.如果y是x左子树中的一个节点,那么y.key≤x.key.如果y是x右子树中的一个节点,那么y.key≥x.key.

《数据结构复习笔记》--二叉搜索树

二叉搜索树:维基百科:click here 二叉查找树(Binary Search Tree),也称二叉搜索树.有序二叉树(ordered binary tree),排序二叉树(sorted binary tree),是指一棵空树或者具有下列性质的二叉树: 若任意节点的左子树不空,则左子树上所有结点的值均小于或等于它的根结点的值: 任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值: 任意节点的左.右子树也分别为二叉查找树. 没有键值相等的节点(no duplicate nodes

二叉搜索树和双向链表

题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. //二叉搜索树转换成双向链表.  //二叉树当前结点的左指针应指向该结点左子树中最右孩子的结点:同时最右孩子的右指针应指向当前结点:  //二叉树当前结点的右指针应指向该结点右子树中最左孩子的结点:同时最左孩子的左指针应指向当前结点:  public TreeNode Convert(TreeNode pRootOfTree) {      if(pRootOfTree=