c++-二叉搜索树的遍历问题

问题描述

二叉搜索树的遍历问题
 #include<iostream>
#include<string>
using namespace std;
class node{
public:
    string name;
    string keyword;
    node* left;
    node* right;
    node(string a = 0, string b = 0, node* c = 0, node* d = 0) :
        name(a), keyword(b), left(c), right(d){}
};
void search(string name2, string keyword2, bool& nameb, bool& keywordb,node* root){
    node* p = root;
    nameb = keywordb = false;
    while (p){
        if (name2 < p->name)
            p = p->left;
        else if (name2>p->name)
            p = p->right;
        else {
            nameb = true;
            if (keyword2 == p->keyword){
                keywordb = true;
                return;
            }
            else{
                keywordb = false;
                return;
            }
        }
    }
}
void login(){
    node a;
    a.name = "f";
    a.keyword = "f";
    a.left = new node("c", "c");
    a.left->left = new node("123", "123");
    a.right = new node("one", "one");
    a.right->right = new  node("wang", "@@110");
    node* root = &a;
    cout << "请输入要登录的用户名和密码" << endl;
    string c, d;
    cin >> c >> d;
    bool nameb, keywordb;//判断用户名和密码正确与否
    search(c, d, nameb, keywordb,root);
    if (nameb&&keywordb)cout << "登录成功!" << endl;
    else if (nameb == true && keywordb == false){
        while (keywordb == false){
            cout << "您输入的密码有误,请重新输入密码" << endl;
            cin >> d;
            search(c,d, nameb, keywordb,root);
            if (keywordb == true){
                cout << "登录成功!" << endl;
                return;
            }
        }
    }
    else {
        cout << "您输入的用户名不存在!请重新输入用户名和密码!" << endl;
        login();
    }
    delete a.left->left;
    a.left->left = 0;
    delete a.left;
    a.left = 0;
    delete a.right->right;
    a.right->right = 0;
    delete a.right;
    a.right = 0;
}

int main(){
    login();
}

我是在做一个二叉平衡树的实验,出现了一个问题,所以简化代码测试如上,但是运行不能通过,若是通过了,在连续两次输对用户名,输错密码之后,会有一个小错误,求解啊

解决方案


若是通过了,在连续两次输对用户名,输错密码之后,会连续两次cout << "您输入的用户名不存在!请重新输入用户名和密码!" << endl;

解决方案二:

Description

给定一组无序整数,以第一个元素为根节点,生成一棵二叉搜索树,对其进行中序遍历和先序遍历。

Input

输入包括多组数据,每组数据包含两行:第一行为整数m(1

Output

每组输入产生两行输出,第一行是中序遍历结果,第二行是先序遍历结果,每个整数后面带一个空格,每行中第一个整数前无空格。

Sample Input
Copy sampl......
答案就在这里:二叉搜索树的遍历
----------------------

解决方案三:

具体是什么错误啊,程序段错误还是逻辑问题啊?

解决方案四:

使用了无效的空指针,下面稍改了下看看是否可以。
另外,编码的格式太不严谨,建议使用指针之前要判空,内存申请后要记得释放。

下面是我写的二叉查找树代码,也许对你有用。
http://www.cnblogs.com/libin2015/articles/5010875.html

 void search(string name2, string keyword2, bool& nameb, bool& keywordb,node* root){
    node* p = root;
    nameb = keywordb = false;
    while (p){
        if (name2 < p->name)
            p = p->left;
        else if (name2>p->name)
            p = p->right;
        else {
            nameb = true;
            if (keyword2 == p->keyword){
                keywordb = true;
                return;
            }
            else{
                keywordb = false;
                return;
            }
        }
    }
        return; //add
}
void login(){
    node a;
    a.name = "f";
    a.keyword = "f";
    a.left = new node("c", "c");
    a.left->left = new node("123", "123");
    a.right = new node("one", "one");
    a.right->right = new  node("wang", "@@110");
    node* root = &a;
    cout << "请输入要登录的用户名和密码" << endl;
    string c, d;
    cin >> c >> d;
    bool nameb, keywordb;//判断用户名和密码正确与否
    search(c, d, nameb, keywordb,root);
    if (nameb&&keywordb)
        {
            cout << "登录成功!" << endl;
            return; //add
        }
    else if (nameb == true && keywordb == false){
        while (keywordb == false){
            cout << "您输入的密码有误,请重新输入密码" << endl;
            cin >> d;
            search(c,d, nameb, keywordb,root);
            if (keywordb == true){
                cout << "登录成功!" << endl;
                return;
            }
        }
    }
    else {
        cout << "您输入的用户名不存在!请重新输入用户名和密码!" << endl;
                //add
                delete a.left->left;
                a.left->left = 0;
                delete a.left;
                a.left = 0;
                delete a.right->right;
                a.right->right = 0;
                delete a.right;
                a.right = 0;
                //add
        login();
    }
    delete a.left->left;
    a.left->left = 0;
    delete a.left;
    a.left = 0;
    delete a.right->right;
    a.right->right = 0;
    delete a.right;
    a.right = 0;
}

int main(){
    login();
        return 0;
}

时间: 2024-12-23 04:32:56

c++-二叉搜索树的遍历问题的相关文章

剑指offer系列之二十二:二叉搜索树的后续遍历序列

题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 此题仍然是对二叉树遍历方法的考察,但是与直接对遍历方法的考察不太一样,因为这里的输入是后续遍历的序列,所以要判断该序列是否是某二叉树的后续遍历结果,关键在于找出根节点,根节点的左子树和根节点的右子树,然后继续对左子树和右子树进行判断,直到全部元素访问完毕.这里很显然是一个递归的过程.由于后续遍历是先访问双亲节点,接着访问左孩子,再访问右孩子,所以需

二叉搜索树与树的遍历非递归练习

复习了二叉搜索树的实现,包括插入.查找和删除操作,顺便做了下二叉树的三种遍历操作.全部操作采用非递归方式.   #include<iostream>   #include<stack>   using namespace std;     typedef int T;   // 值类型      // 节点定义    struct node {       T val;       node *left,*right;       node(const T& val):va

[华为机试练习题]33.二叉搜索树

题目 描述: 判断两序列是否为同一二叉搜索树序列 题目类别: 树 难度: 中级 运行时间限制: 10Sec 内存限制: 128MByte 阶段: 入职前练习 输入: 开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束. 接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树. 接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树. 输出: 如果序列相同则输出YES

九度题目1009:二叉搜索树

题目1009:二叉搜索树 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:4308 解决:1919 题目描述: 判断两序列是否为同一二叉搜索树序列 输入: 开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束. 接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树. 接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树. 输出: 如果序列相同则输出YES

二叉搜索树与双向链表的C++实现

题目:输入一颗二叉搜索树, 将该二叉搜索树转换成一个排序的双向链表. 要求不能创建任何新的结点, 只能调整数中结点的指针的指向. 方法: 使用中序遍历每一个结点, 并进行连接, 即左子树指前, 右子树指后, 并保存前一个节点. 本程序包含算法原理, 测试程序, 及 输出. 代码: /* * main.cpp * * Created on: 2014.6.12 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #include <iostream> #i

二叉搜索树(Binary Search Tree)--C语言描述(转)

图解二叉搜索树概念 二叉树呢,其实就是链表的一个二维形式,而二叉搜索树,就是一种特殊的二叉树,这种二叉树有个特点:对任意节点而言,左孩子(当然了,存在的话)的值总是小于本身,而右孩子(存在的话)的值总是大于本身. 下面来介绍在此种二叉树结构上的查找,插入,删除算法思路. 查找:因为这种结构就是为了来方便查找的,所以查找其中的某个值很容易,从根开始,小的往左找,大的往右找,不大不小的就是这个节点了: 代码很简单,这里就不写了. 插入:插入一样的道理,从根开始,小的往左,大的往右,直到叶子,就插入.

剑指offer系列之二十五:二叉搜索树与双向链表

题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 由于二叉搜索树的中序遍历就是排序的,如果是构造单链表,只需要一次中序遍历就可以了,但现在需要构造双链表,也就是在中序遍历的过程中需要设置每个节点的left与right指针,现在问题是如何设置这两个指针?二叉搜索树有一个特点,就是根节点的左子树上所有节点都比根节点的值小,而右子树上的所有节点的值都比根节点的值大,利用这个性质,当遍历根节点的左孩子的时候,可以继续把其当做左子

二叉搜索树的插入与删除(详细解析)_C 语言

题目:创建一个类,类中的数据成员时一棵二叉搜索树,对外提供的接口有添加结点和删除结点这两种方法.用户不关注二叉树的情况.要求我们给出这个类的结构以及实现类中的方法. 思路添加结点:添加结点其实很容易,我们只需要找到结点所行对应的位置就可以了,而且没有要求是平衡的二叉搜索树,因此每次添加结点都是在叶子结点上操作,不需要修改二叉搜索树整体的结构.要找出添加节点在二叉搜索树中的位置,可以用一个循环解决.判断插入结点与当前头结点的大小,如果大于头结点则继续搜索右子树,如果小于头结点则继续搜索左子树.直到

二叉搜索树源码分享_C 语言

复制代码 代码如下: #include <iostream>using namespace std; //枚举类,前中后三种遍历方式enum ORDER_MODE{ ORDER_MODE_PREV = 0, ORDER_MODE_MID, ORDER_MODE_POST}; //树节点的结构体template <class T>struct BinaryNode{ T    element; BinaryNode  *left; BinaryNode  *right;  Binar