• 二元查找树转换成一个排序的双向链表


    输入一棵二元查找树。将该二元查找树转换成一个排序的双向链表。要求不能创建不论什么新的结点,仅仅调整指针的指向。


    最直观的一种思路就是每次从二分查找树中找到最小的数。加到链表中


    </pre><pre name="code" class="cpp">// BST2list.cpp : 定义控制台应用程序的入口点。
    //
    
    #include "stdafx.h" 
    #include<iostream> 
    using namespace std;
    #define INFINITY 1000000
    struct BiNOde
    {
    	int ele;
    	BiNOde* lnode;
    	BiNOde* rnode;
    };
    int min;
    BiNOde*head, *tail;
    BiNOde*minnode;
    BiNOde*p;
    BiNOde*create_tree()
    {
    	BiNOde * root = new BiNOde;
    	BiNOde*node1 = new BiNOde;
    	BiNOde*node2 = new BiNOde;
    	BiNOde*node3 = new BiNOde;
    	BiNOde*node4 = new BiNOde;
    	BiNOde*node5 = new BiNOde;
    	BiNOde*node6 = new BiNOde;
    	BiNOde*node7 = new BiNOde;
    	BiNOde*node8 = new BiNOde;
    	BiNOde*node9 = new BiNOde;
    	BiNOde*node10 = new BiNOde;
    	BiNOde*node11 = new BiNOde;
    	root->ele = 45;
    	node1->ele = 38;
    	node2->ele = 55;
    	node3->ele = 33;
    	node4->ele = 43;
    	node5->ele = 19;
    	node6->ele = 16;
    	node7->ele = 52;
    	node8->ele = 58;
    	node9->ele = 50;
    	node10->ele = 41;
    	node11->ele = 35;
    	root->lnode = node1;
    	root->rnode = node2;
    	node1->lnode = node3;
    	node1->rnode = node4;
    	node2->lnode = node7;
    	node2->rnode = node8;
    	node3->lnode = node5;
    	node3->rnode = node11;
    	node4->lnode = node10;
    	node4->rnode = NULL;
    	node5->lnode = node6;
    	node5->rnode = NULL;
    	node6->lnode = NULL;
    	node6->rnode = NULL;
    	node7->lnode = node9;
    	node7->rnode = NULL;
    	node8->lnode = NULL;
    	node8->rnode = NULL;
    	node9->lnode = NULL;
    	node9->rnode = NULL;
    	node10->lnode = NULL;
    	node10->rnode = NULL;
    	node11->lnode = NULL;
    	node11->rnode = NULL;
    	//BiNOde*node12 = new BiNOde;  
    	//node12->ele = 12;  
    	//node12->lnode = NULL;  
    	//node12->rnode = NULL;  
    	//node6->lnode = node11;  
    	return root;
    }
    
    BiNOde*find_min(BiNOde*node)
    {
    	//minnode=node;这一句会使递归出错
    	if (node == NULL)
    		return NULL;
    	if (node->ele < min)
    	{
    		min = node->ele;
    		minnode = node;
    	}
    	if (node->lnode != NULL)
    	{
    		if (node->lnode->ele < min)
    		{
    			min = node->lnode->ele;
    			minnode = node->lnode;
    		}
    		find_min(node->lnode);
    	}
    	if (node->rnode != NULL)
    	{
    		if (node->rnode->ele < min)
    		{
    			min = node->rnode->ele;
    			minnode = node->rnode;
    		}
    
    		find_min(node->rnode);
    	}
    	return minnode;
    }
    
    void findparent(BiNOde*node, BiNOde*parent)
    {
    	if (parent == NULL)
    		return;
    	if (parent->lnode == node || parent->rnode == node)
    		{p = parent;return;}
    	findparent(node, parent->lnode);
    	findparent(node, parent->rnode);
    }
    
    
    BiNOde*BST2list(BiNOde*root)
    {
    	min = INFINITY;
    	minnode = NULL;
    	BiNOde*n = find_min(root);
    
    	while (n)
    	{
    		if (n == root)
    		{
    			if (n->rnode != NULL)
    				root = n->rnode;
    			else
    			{
    				tail->rnode = n;
    				n->lnode = tail;
    				tail = n;
    				return head;
    			}
    
    		}
    		else
    			if (n->rnode != NULL)
    			{
    			p = NULL;
    			findparent(n, root);
    			if (p != NULL)
    				p->lnode = n->rnode;
    			n->rnode = NULL;
    			}
    			else
    			{
    				p = NULL;
    				findparent(n, root);
    				if (p != NULL)
    					p->lnode = NULL;
    			}
    		if (head == NULL&&tail == NULL)
    		{
    			head = tail = n;
    
    		}
    		else if (head == tail)
    		{
    			tail->rnode = n;
    			n->lnode = tail;
    			tail = n;
    			head->rnode = tail;
    
    		}
    		else
    		{
    			tail->rnode = n;
    			n->lnode = tail;
    			tail = n;
    		}
    		min = INFINITY;
    		minnode = NULL;
    		n = find_min(root);
    	}
    
    }
    
    
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    
    	head = tail = NULL;
    	BiNOde*root = create_tree();
    	head = BST2list(root);
    
    
    	system("pause");
    	return 0;
    }
    

    find_min递归时minnode数据放的位置不正确。造成開始递归失败。所以要特别注意以影响递归过程的变量的处理。


  • 相关阅读:
    CSS选择器及优先级
    iframe中跨域页面访问parent的方法
    网页外链用了 target=_blank,结果悲剧了
    CarbonData:大数据融合数仓新一代引擎
    补习系列(14)-springboot redis 整合-数据读写
    python读写配置文件使用总结与避坑指南
    【云速建站】后台配置邮费
    解析:区块链的本质是伴随信息社会产生的一种新型生产关系
    用“黑科技”产放心粮,种地竟然和想象中有点不一样
    【云速建站】按照给定模板从0开始编辑网站页面
  • 原文地址:https://www.cnblogs.com/tlnshuju/p/7149491.html
Copyright © 2020-2023  润新知