第一题 把二元查找树转变成排序的双向链表

本文介绍了一种算法,能够将给定的二叉查找树转换为一个排序的双向链表,此过程不创建新节点,仅调整现有节点间的指针连接。通过递归方法实现树的转换,并提供了完整的C++代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。
    10
   /   \
  6   14
 /  \   /   \
4   8 12   16
转换成双向链表

4=6=8=10=12=14=16


注意二叉排序树的建立过程


#include<stdio.h>
#include<stdlib.h>
struct BiTreeNode
{
       int value; 
      BiTreeNode *left; 
      BiTreeNode *right; 
};
typedef BiTreeNode* BSTree;
typedef BiTreeNode BSTNode;

void Convert(BiTreeNode *& head, BiTreeNode *& tail, BiTreeNode *root) 
{
      BiTreeNode *left, *right;
      if (root == NULL) 
      {
            head = NULL;
            tail = NULL;
            return;
      }
      Convert(head, left, root->left);
      Convert(right, tail, root->right);
      if (left!=NULL) 
     {
             left->right = root;
             root->left = left;
     } 
    else 
    {
            head = root;
    }
    if (right!=NULL) 
   {
         root->right=right;
         right->left = root;
   } 
   else 
    {
          tail = root;
    }

}

BiTreeNode * treeToLinkedList(BiTreeNode * root) 
{
 BiTreeNode * head, * tail;
 Convert(head, tail, root);
 return head;//返回链表的头指针
}

BiTreeNode *searchBST(BiTreeNode *root,int key)
{
	if((!root)||(root->value==key))
		return root;
	else if(key<root->value)
		return searchBST(root->right,key);
	else return searchBST(root->right,key);
}

BSTree InsertBST(BSTree Tptr,int key)
{
	BSTree f,p=Tptr;
	while(p)
	{
		if(p->value==key) //不插入重复数字(关键字) 
			return Tptr;
		f=p;   //f记录的是要插入的节点的父结点 
		p=(key<p->value)?p->Lchild:p->Rchild;
	}
	p=new BSTNode;
	p->key=key;
	p->Lchild=p->Rchild=NULL;
	if(Tptr==NULL)//如果本来是空树 
		Tptr=p;
	else  //原数中已有节点,则将p当作f的左孩子或者右孩子插入 
	{
		if(key<f->value)
			f->Lchild=p;
		else
			f->Rchild=p; 
	}
	return Tptr;  //将树的根节点还返回 
} 
BSTree CreateBST()//建立二叉排序树 
{
	BSTree T=NULL;
	int key;
	cout<<"输入元素:"<<endl;
	while(1)
	{
		cin>>key;
		if(key==0) //默认不插入关键值是0的节点 
			break;
		T=InsertBST(T,key); //调用插入函数进行插入 
	}
	return T;
}

//中序遍历二叉树
void InOrderTraverse(BiTreeNode * root)
{
       if(root->left)
		   InOrderTraverse(root->left);
	   if(root)
             printf("%d  ",root->value);
	   if(root->right)
             InOrderTraverse(root->right);
}
int main()
{
        BiTreeNode * root=CreateBST();
        InOrderTraverse(root);
        printf("\n");

       BiTreeNode *head=treeToLinkedList(root);

       BiTreeNode * temp=head;
        while(temp!=NULL)
        {
              printf("%d  ",temp->value);
              temp=temp->right;
        }

       getchar();
       return 0; 
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值