被要求动态建立二叉树,并切有序,然后中序输出,先把代码贴出来,再给予讲解。
// ConsoleApplication11.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
//#include "pch.h"
#include <iostream>
using namespace std;
class bitNode
{
public:
int key;
bitNode *lchild, *rchild;
bitNode(){}
bitNode(int data,bitNode *lchild=NULL,bitNode *rchild=NULL)
{
key = data;
}
};
class biTree
{
public:
bitNode *root;
biTree()
{
root = NULL;
}
bool search(int data)
{
bitNode *x = root;
if (x== NULL)
{
return false;
}
while (x != NULL)
{
if (x->key == data)
return true;
else if (x->key > data)
x = x->lchild;
else
x = x->rchild;
}
return false;
}
void insert(int data)
{
if (search(data)==false)
{
bitNode *s = root;
if (s == NULL)
{
s = new bitNode(data);
root = s;
return;
}
bitNode *p = new bitNode(); //双亲节点
while (s != NULL)
{
p = s;
if (s->key > data)
s = s->lchild;
else
s = s->rchild;
}
if (p->key>data)
{
p->lchild=new bitNode(data);
}
else
{
p->rchild=new bitNode(data);
}
}
}
void inOrderTraverse(bitNode *&T)
{
if (T)
{
inOrderTraverse(T->lchild);
cout <<T->key << " ";
inOrderTraverse(T->rchild);
}
}
};
int main()
{
int t;
cin >> t;
while (t--)
{
int n;
cin >> n;
int data;
biTree tree;
for (int i = 0; i < n; i++)
{
cin >> data;
tree.insert(data);
}
tree.inOrderTraverse(tree.root);
cout << endl;
int m;
cin >> m;
for (int i = 0; i < m; i++)
{
cin >> data;
tree.insert(data);
tree.inOrderTraverse(tree.root);
cout << endl;
}
}
}
这道题目最重要的点有两个,一个是查找我们想要插入的节点存不存在,第二个是如果这个节点
不存在的话,插入这个节点。
查找的时候分两类:一类是这个二叉表存在或不存在,当不存在的时候root==NULL,得返回false;
当这个表存在的时候查找这个节点就是一个个遍历,存在3种可能性,第一种这个要插入的data等于这个的节点的值,这时返回true,就是找到,当这个值大于节点的值的时候往右方向走,当这个值小于节点的值的时候往左边走,直到这个二叉树的末尾。
插入也分为两类情况,当这个表彻底就是空的,当这个表存在我们就得插入我们想要插入的值到适合的位置。
首先检查这个值存不存在,如果不存在,建立一个节点并这个节点成为根。
如果存在我们得找到适合位置的双亲节点,并这个要插入的data成为其左右节点之一。
扫描二维码关注公众号,回复:
8773136 查看本文章