二叉搜索树与双向链表
来源:互联网 发布:三网通游戏源码 编辑:程序博客网 时间:2024/05/18 01:51
题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。 二叉搜索树性质:对于树中的每个节点X,它的左子树中所有关键字值小于X的关键字值,它的右子树所有关键字值大于X关键字值。 二叉搜索树
只完成了功能函数参考别人的思路写的一个版本:
利用了递归:递归是一个非常常用的方法,但是,一定要理清思路后再下手。思路形成后用代码的形式表现出来
TreeNode* Convert(TreeNode* root) { if(root==NULL) return NULL; if(root->left==NULL&&root->right==NULL) return root; TreeNode* left=Convert(root->left); TreeNode* p=left; //以下这个循环简直是神来之笔,这个循环最后将p转移到了左子树形成的双向链表的尾部,便于我的root插入双向链表 while(p!=NULL&&p->right!=NULL) p=p->right; //将跟节点插入排列好的左子树后面 if(left!=NULL){ p->right=root; root->left=p; } TreeNode* right=Convert(root->right); //左子树和右子树的区别在于:右子树,直接将最小的点和root节点链接起来就ok,即少了那个while循环 if(right!=NULL){ right->left=root; root->right=right; } //这句返回也是很简洁,当left为空时,则返回root节点,因为是按照中序遍历才能得到排序的双向链表 return left!=NULL?left:root; }自己看书写的一个版本
//定义了一个无返回值的函数,完成排序双向链表的功能函数 //两个变量,分别是当前节点,以及排序链表的最后一个节点 void ConvertNode(TreeNode* pNode, TreeNode** pLastNodeInList) { //递归条件的判断 if(pNode==NULL) return; //新建当前节点 TreeNode* pCurrent=pNode; if(pCurrent->left!=NULL) ConvertNode(pCurrent->left,pLastNodeInList); //以下三句是将pCurrent插入链表最后,中间有个判断 pCurrent->left=*pLastNodeInList; if((*pLastNodeInList)!=NULL) (*pLastNodeInList)->right=pCurrent; //插入后,当前的新节点就作为链表最后一个节点 (*pLastNodeInList)=pCurrent; //将右节点插入的判断 if(pCurrent->right!=NULL) ConvertNode(pCurrent->right,pLastNodeInList); } TreeNode* Convert(TreeNode* pRootofTree) { //pLastNodeList用来指向已转换好的链表的最后一个节点TreeNode* pLastNodeInList=NULL; //需要新建一个函数完成相应的功能,排序功能 ConvertNode(pRootofTree, &pLastNodeInList); TreeNode* HeadofList=pLastNodeInList; //while循环只是为了能够返回双向链表的头部,并且最后返回 while(HeadofList!=NULL&&HeadofList->left!=NULL){ HeadofList= HeadofList->left; } return HeadofList; }
0 0
- 二叉搜索树与双向链表
- 二叉搜索树与双向链表
- 二叉搜索树与双向链表
- 二叉搜索树与双向链表
- 二叉搜索树与双向链表
- 二叉搜索树与双向链表
- 二叉搜索树与双向链表
- 二叉搜索树与双向链表
- 二叉搜索树与双向链表
- 二叉搜索树与双向链表
- 二叉搜索树与双向链表
- 二叉搜索树与双向链表
- 二叉搜索树与双向链表
- 二叉搜索树与双向链表
- 二叉搜索树与双向链表
- 二叉搜索树与双向链表
- 二叉搜索树与双向链表
- 二叉搜索树与双向链表
- git请求报错 401
- Activtiy简介
- Boolan C++面向对象高级编程(下)第四周笔记
- stm32时钟分割
- java1.8新特性之接口定义增强
- 二叉搜索树与双向链表
- ssh连接永久保持
- 高仿通讯录按照26字母排序和右边放置字母快捷查找
- Android中getActivity()为null的解决办法
- qt qss设置
- Redis主从复制
- CTSC2017 总结
- cortex-m3 的汇编文件学习
- api level 对照