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

举报
香菜聊游戏 发表于 2021/07/15 01:09:17 2021/07/15
【摘要】 参考地址为 //* Copyright(C) 2011 //*//* FUNCTION : TreeToLink//* DESCRIPTION : Tree to link//* PARAMETERS : Type Name Description//* RETURN : Type Values Description//* CREATED DATE/BY : 2...

参考地址为



      //* Copyright(C) 2011 
      //*
      //* FUNCTION : TreeToLink
      //* DESCRIPTION : Tree to link
      //* PARAMETERS : Type Name Description
      //* RETURN : Type Values Description
      //* CREATED DATE/BY : 2011/11/30 perfect2011
      //*
      //* REVISION HISTORY:V1.0
      /*
      1.把二元查找树转变成排序的双向链表
      题目:
      输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
      要求不能创建任何新的结点,只调整指针的指向。
       10
       / /
       6 14
      / / / /
      4 8 12 16
      转换成双向链表
      4=6=8=10=12=14=16。
      */
      #include "stdafx.h"
      #include <iostream>
      using namespace std;
      struct TreeNode
      {
      int m_nValue; // value of node
       TreeNode *m_pLeft; // left child of node
       TreeNode *m_pRight; // right child of node
      };
      typedef TreeNode DoubleList;
      DoubleList * pHead;
      DoubleList * pListIndex;
      //生成查找树
      void adjust(TreeNode * & pCurrent, int value)
      {
     	//根节点的处理,生成根节点,为pCurrent赋值 重点理解:注意为传址,修改了main内的pRoot
     	if(NULL == pCurrent)
      	{
      	TreeNode *pEnd = new TreeNode();
      	pEnd ->m_pLeft =NULL;
      	pEnd ->m_pRight = NULL;
      	pEnd ->m_nValue = value;
      	pCurrent = pEnd;
      	}
     	//
     	else
      	{   //在左子树添加
     		if (value<pCurrent->m_nValue)
      		{
      			adjust(pCurrent->m_pLeft,value);
      		}
     		//在右子树添加
     		else if(value>pCurrent->m_nValue)
      		{
      			adjust(pCurrent->m_pRight,value);
      		}
     		else
      		{
     		cout<<" 重 复 的 节 点 "<<endl;
      		}
      	}
      }
      void addList(TreeNode *pCurrent);
      //covert the tree to link
      void covertTreeToLink(TreeNode *pCurrent)
      {
     	//中序读出
     	if(pCurrent==NULL)
      	{
     	return;
      	}
     	//遍历左子树
     	if(NULL != pCurrent->m_pLeft)
      	{
      	covertTreeToLink(pCurrent->m_pLeft);
      	}
     	//将根节点加进链表
      	addList(pCurrent);
     	//遍历右子树
     	if(NULL != pCurrent->m_pRight)
       {
      		covertTreeToLink(pCurrent->m_pRight);
      	}
      }
      //添加节点到链表
      void addList(TreeNode *pCurrent)
      {
      if(NULL ==pListIndex)
      	pHead = pListIndex;
      else
      {
      pCurrent->m_pLeft = pListIndex;
      pListIndex ->m_pRight = pCurrent;
      pListIndex = pCurrent;//指针后移
      }
      cout<<"Now "<<pCurrent->m_nValue<<endl;
      }
      int main()
      {   TreeNode * pRoot = NULL;
       pListIndex = NULL;//链表的移动指针
       pHead = NULL;//链表的头指针
      	adjust(pRoot, 10);
       adjust(pRoot, 4);
       adjust(pRoot, 6);
       adjust(pRoot, 8);
       adjust(pRoot, 12);
       adjust(pRoot, 14);
       adjust(pRoot, 15);
       adjust(pRoot, 16);
       covertTreeToLink(pRoot);
       getchar();
      return 0;
      }
  
 


文章来源: gamwatcher.blog.csdn.net,作者:香菜聊游戏,版权归原作者所有,如需转载,请联系作者。

原文链接:gamwatcher.blog.csdn.net/article/details/7026968

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。