继续上上篇博客,只写了一个二叉树常用方法,上篇中有些不足:
1、添加新节点 那段代码可以独立出来,用递归方式写成
void insertNode(BSTree* &p, int value)
{
if(p == NULL){
p = new BSTree();
p->value = value;
p->bsLeft = NULL;
p->bsRight = NULL;
return;
}
if(value < p->value)
insertNode(p->bsLeft, value);
else if(value >= p->value)
insertNode(p->bsRight, value);
}
2、查找也同上进行更改,递归调用自身
------------------------------------------------
这里引入一个新问题
1.把二元查找树转变成排序的双向链表
题目:
输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。
10
/ \
6 14
/ \ / \
4 8 12 16
转换成双向链表
4=6=8=10=12=14=16。
首先我们定义的二元查找树 节点的数据结构如下:
struct BSTreeNode
{
int m_nValue; // value of node
BSTreeNode *m_pLeft; // left child of node
BSTreeNode *m_pRight; // right child of node
};
*/
这里考虑下,我们遍历的时候是按顺序输出,那我们是有办法得到这个顺序链表的,所以只要对遍历函数稍加改变即可
这里引入两个共有变量
BSTree* cur = NULL; BSTree*dchain_head = NULL;
加入下面着两个函数,主要的是第二个
void printDoubleChain(); voidch(BSTree*);
实现如下:
void ch(BSTree* p) {
if(p==NULL){
return;
}
ch(p->bsLeft);
//这里把打印变成记录我们当前双向链表记录的指针,只要控制让他们形成链表关系就可以了
if(cur == NULL){
cur = p;
dchain_head = cur;
}else{
cur->bsRight = p;
p->bsLeft = cur;
cur = p;
} //
ch(p->bsRight);
}
打印如下
void printDoubleChain() {
cur =dchain_head;
cout<<"from left to right"<<endl;
while(cur->bsRight!=NULL){
cout<<cur->value<<" ";
cur = cur->bsRight;
}
cout<<cur->value<<" ";
//这里不想让cur跑到结尾空出,所以尾巴单独打印
//下面重新逆向循环
cout<<"from right toleft"<<endl;
while(cur->bsLeft!=NULL){
cout<<cur->value<<" ";
cur = cur->bsLeft;
}
cout<<cur->value<<" ";
}