二叉搜索树转换为双向链表
来源:互联网 发布:sql case when 多行 编辑:程序博客网 时间:2024/05/21 09:14
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
思路:
方法一:非递归版
解题思路:
1
.核心是中序遍历的非递归算法。
2
.修改当前遍历节点与前一遍历节点的指针指向。
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;stack<TreeNode*> sta;TreeNode* p = pRootOfTree;TreeNode* pre = NULL,*root;// pre用于保存中序遍历序列的上一节点bool isFirst = true;while(p!=NULL||!sta.empty()){while(p!=NULL){sta.push(p);p = p->left;}p = sta.top();sta.pop();if(isFirst){root = p;// 将中序遍历序列中的第一个节点记为rootpre = root;isFirst = false;}else{pre->right = p;p->left = pre;pre = p;} p = p->right;}return root;}};
方法二:递归版
解题思路:
1
.将左子树构造成双链表,并返回链表头节点。
2
.定位至左子树双链表最后一个节点。
3
.如果左子树链表不为空的话,将当前root追加到左子树链表。
4
.将右子树构造成双链表,并返回链表头节点。
5
.如果右子树链表不为空的话,将该链表追加到root节点之后。
6
.根据左子树链表是否为空确定返回的节点。
public TreeNode Convert(TreeNode root) {if(root==null)return null;if(root.left==null&&root.right==null)return root;// 1.将左子树构造成双链表,并返回链表头节点TreeNode left = Convert(root.left);TreeNode p = left;// 2.定位至左子树双链表最后一个节点while(p!=null&&p.right!=null){p = p.right;}// 3.如果左子树链表不为空的话,将当前root追加到左子树链表if(left!=null){p.right = root;root.left = p;}// 4.将右子树构造成双链表,并返回链表头节点TreeNode right = Convert(root.right);// 5.如果右子树链表不为空的话,将该链表追加到root节点之后if(right!=null){right.left = root;root.right = right;}return left!=null?left:root; }
阅读全文
0 0
- 二叉搜索树转换为双向链表
- diary5(二叉搜索树转换为双向链表)
- 二叉搜索树转换为有序双向链表
- 二叉搜索树转换为有序双向链表
- 二叉搜索树转换为有序双向链表
- java之二叉搜索树转换为双向链表
- 二叉搜索树转换为双向链表
- 二叉搜索树转换为有序双向链表
- 将二叉搜索树转换为双向链表
- 二叉搜索树转换为双向链表
- 二叉搜索树转换为双向链表
- 搜索二叉树转换为双向链表
- 平衡二叉搜索树BST转换为双向链表
- 二叉搜索树转换为有序双向链表
- 二叉搜索树转换为双向链表
- 二叉搜索树转换为双向链表
- 将二叉搜索树转换为双向链表
- 如何搜索二叉树转换为双向链表
- 自定义在springMvc中实现struts2的赋值操作
- 双向可控硅在交流调压电路中的使用
- java邮件
- 整数中1出现的次数(从1到n整数中1出现的次数)(java版)
- hibernate入门之环境准备,以及第一个例子。
- 二叉搜索树转换为双向链表
- PHP哈希表碰撞攻击原理
- 开发者入门必读:最值得看的十大机器学习公开课
- Android存储---SQLite数据库存储
- 软考笔记0608
- 19 linux字符设备驱动
- TCP/IP协议简介
- 一个对象占用多少字节?
- 跨域资源共享 CORS 详解