CodingQK 2017-03-17 16:01 采纳率: 0%
浏览 954
已结题

二叉搜索树的插入问题!

自己用类实现的时候,发现每次插入后...新值插入,root(命名为TREE)又变成了空指针...
所以遍历的时候直接返回了
求问怎么改动... 主要问题应该在Insert_Node

 #include<iostream>
#include<algorithm>
#include<string>
#include<vector>
using namespace std;

//define the Binary Search Tree class 
class BSearch_Tree {
public:
    int key;
    BSearch_Tree *left;
    BSearch_Tree *right;
    BSearch_Tree *parent;
    BSearch_Tree():left(nullptr),right(nullptr),parent(nullptr){}
    //拷贝构造函数
    BSearch_Tree(const BSearch_Tree& T);
    BSearch_Tree& operator=(const BSearch_Tree& T);
    ~BSearch_Tree();
};

BSearch_Tree::BSearch_Tree(const BSearch_Tree& T) {
    key = T.key;
    if(left==nullptr){ left = new BSearch_Tree(); *left = *T.left;}
    else *left = *T.left;;
    if (right == nullptr) { right = new BSearch_Tree(); *right = *T.right; }
    else *right = *T.right;
    if (parent == nullptr) { parent = new BSearch_Tree(); *parent = *T.parent; }
    else *parent = *T.parent;
}
BSearch_Tree& BSearch_Tree::operator=(const BSearch_Tree& T) {
    key = T.key;
    if (left == nullptr) { left = new BSearch_Tree(); *left = *T.left; }
    else *left = *T.left;;
    if (right == nullptr) { right = new BSearch_Tree(); *right = *T.right; }
    else *right = *T.right;
    if (parent == nullptr) { parent = new BSearch_Tree(); *parent = *T.parent; }
    else *parent = *T.parent;
    return *this;
}
BSearch_Tree::~BSearch_Tree() {
    delete left; left = nullptr;
    delete right; right = nullptr;
    delete parent; parent = nullptr;
}

//The operations of BSearch_Tree 
//Include : Insert the node , search the node , delete the node , print the tree 
void Insert_Node(BSearch_Tree* T, int key) {
    BSearch_Tree *y=new BSearch_Tree(),*z=new BSearch_Tree();
    BSearch_Tree* x = T;
    z->key = key;
    if (!x ) { T = z; cout << T->key; return; } //每次都x==nulptr?????
    while (x !=nullptr ) {
        y = x;   //set y as parent
        x = (z->key <= x->key) ? x->left : x->right;
    }
        z->parent = y;
        if (z->key < y->key)y->left = z;
        else y->right = z;

}

void Print_Tree(const BSearch_Tree *T) {
        if (!T) return; 
        cout << T->key << ' ';
        Print_Tree(T->left);
        Print_Tree(T->right);
}

int main() {
    cout << "Input the number of cmds \n"
        << "Formatted as : \"Insert \'key\' \"\n or            \"Search \'key\' \"\n or"
        <<"            \"Delete \'key\' \"\n or"
        <<"            \"Print\" "
        << endl;
    BSearch_Tree* TREE=nullptr;
    int node_nums, key;
    string cmd;
    cin >> node_nums;
    for (int i = 0; i < node_nums; ++i) {
        cin >> cmd;
        if (cmd == "Insert") {
            cin >> key;
            Insert_Node(TREE, key);
        }
        else if (cmd == "Print") {
            cout << "Printed by inordered :\n";
            Print_Tree(TREE);
        }
    }
    return 0;
}
  • 写回答

1条回答 默认 最新

  • devmiao 2017-03-17 17:13
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 LiBeAs的带隙等于0.997eV,计算阴离子的N和P
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘
  • ¥15 来真人,不要ai!matlab有关常微分方程的问题求解决,
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算
  • ¥15 java如何提取出pdf里的文字?
  • ¥100 求三轴之间相互配合画圆以及直线的算法