二叉搜索树与双向链表
来源:互联网 发布:菜鸟网络天津武清园区 编辑:程序博客网 时间:2024/05/21 06:10
题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
一开始有思路,但是在纠结,对于当前节点,要求左子树返回其最大值,而要求右子树返回其最小值,这里用最笨的方法每次判断,并返回。并且还记录的头结点的位置。写的比较麻烦:
/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { }};*/class Solution {public: TreeNode* Convert(TreeNode* pRootOfTree) { if(pRootOfTree==NULL) return NULL; TreeNode* head; int min=INT_MAX; TreeNode* tmp=DFS(pRootOfTree,head,min,0); return head; } TreeNode*& DFS(TreeNode* pRootOfTree,TreeNode* & head,int &min,int signlr){ if(pRootOfTree==NULL) return pRootOfTree; if(pRootOfTree->val<min){ min=pRootOfTree->val; head=pRootOfTree; } TreeNode* lnode; TreeNode* rnode; lnode=DFS(pRootOfTree->left,head,min,1); if(lnode!=NULL) lnode->right=pRootOfTree; pRootOfTree->left=lnode; rnode=DFS(pRootOfTree->right,head,min,2); if(rnode!=NULL) rnode->left=pRootOfTree; pRootOfTree->right=rnode; if(signlr==0||(lnode==NULL&&rnode==NULL)) return pRootOfTree; else if(signlr==1){ if(rnode!=NULL) return rnode; else return pRootOfTree; } else{ if(lnode!=NULL) return lnode; else return pRootOfTree; } }};
借鉴剑指offer的思路,记录链表的最后一个节点,中序遍历就可以实现。
//记录已排好链表的最后一个节点class Solution {public: TreeNode* Convert(TreeNode* pRootOfTree){ if(pRootOfTree==NULL) return NULL; TreeNode* lastNodeOfList=NULL; dfs(pRootOfTree,&lastNodeOfList); while(lastNodeOfList!=NULL&&lastNodeOfList->left!=NULL) lastNodeOfList= lastNodeOfList->left; return lastNodeOfList; } void dfs(TreeNode* curNode,TreeNode** lastNodeOfList){ if(curNode==NULL) return; //遍历左子树 dfs(curNode->left,lastNodeOfList); if(*lastNodeOfList!=NULL) (*lastNodeOfList)->right=curNode; curNode->left=*lastNodeOfList; *lastNodeOfList=curNode; //遍历右子树 dfs((*lastNodeOfList)->right,lastNodeOfList); } };
0 0
- 二叉搜索树与双向链表
- 二叉搜索树与双向链表
- 二叉搜索树与双向链表
- 二叉搜索树与双向链表
- 二叉搜索树与双向链表
- 二叉搜索树与双向链表
- 二叉搜索树与双向链表
- 二叉搜索树与双向链表
- 二叉搜索树与双向链表
- 二叉搜索树与双向链表
- 二叉搜索树与双向链表
- 二叉搜索树与双向链表
- 二叉搜索树与双向链表
- 二叉搜索树与双向链表
- 二叉搜索树与双向链表
- 二叉搜索树与双向链表
- 二叉搜索树与双向链表
- 二叉搜索树与双向链表
- 四大组件之内容提供者——ContentProvider
- 在 PLSQL 中调试 存储过程和存储函数
- 最近的心情
- git常用命令
- 酷炫页面产品图片展示
- 二叉搜索树与双向链表
- mybatis引入映射器与select元素
- Java多线程-工具篇-BlockingQueue
- 高阶篇:3.1)表面处理
- Codeforces807 C. Success Rate
- 当APP被强杀了怎么办?
- Container架构与Hypervisor(VM)架构的对比
- 57. Insert Interval
- 打包APP时报错 linker command failed with exit code 1 (use -v to see invocation)