剑指offer--二叉搜索树与双向链表
2015-04-19 21:42
218 查看
题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。分类:二叉树,链表
解法1:递归解决。先将左右子树转换成双向链表,然后和根节点重新连接
/* public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } */ public class Solution { public TreeNode Convert(TreeNode pRootOfTree) { if(pRootOfTree==null) return null; TreeNode left=null,right=null; if(pRootOfTree.left!=null) left = Convert(pRootOfTree.left); if(pRootOfTree.right!=null) right = Convert(pRootOfTree.right); if(right!=null){ pRootOfTree.right = right; right.left = pRootOfTree; } TreeNode p = left; while(p!=null && p.right!=null){ p = p.right; } if(left!=null){ p.right = pRootOfTree; pRootOfTree.left = p; return left; } return pRootOfTree; } }
使用一个全局变量来记录上一个节点
/** public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } */ public class Solution { TreeNode pre = null; public TreeNode Convert(TreeNode pRootOfTree) { if(pRootOfTree==null) return null; if(pRootOfTree.left==null&&pRootOfTree.right==null){ pre = pRootOfTree; return pRootOfTree; } TreeNode left = Convert(pRootOfTree.left); if(left!=null){ pre.right = pRootOfTree; pRootOfTree.left = pre; } pre = pRootOfTree; TreeNode right = Convert(pRootOfTree.right); if(right!=null){ pRootOfTree.right = right; right.left = pRootOfTree; } return left!=null?left:pRootOfTree; } }
下面是书上的做法,使用一个参数指针省去了头结点的遍历
/* 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){ TreeNode* pLastNodeInList = NULL; CovertNode(pRootOfTree, &pLastNodeInList); TreeNode* pHeadOfList = pLastNodeInList; while (pHeadOfList != NULL && pHeadOfList->left != NULL) { pHeadOfList = pHeadOfList->left; } return pHeadOfList; } void CovertNode(TreeNode* pRoot, TreeNode** pLastNodeInList) { if (pRoot == NULL) return; TreeNode* pCurrent = pRoot; if (pCurrent->left != NULL) CovertNode(pCurrent->left, pLastNodeInList); pCurrent->left = *pLastNodeInList; if (*pLastNodeInList != NULL) (*pLastNodeInList)->right = pCurrent; *pLastNodeInList = pCurrent; if (pCurrent->right != NULL) CovertNode(pCurrent->right, pLastNodeInList); } };
相关文章推荐
- 剑指Offer——(26)二叉搜索树与双向链表
- 剑指Offer_面试题27_二叉搜索树与双向链表
- 剑指Offer面试题27(Java版):二叉搜索树与双向链表
- 剑指offer---二叉搜索树与双向链表
- (C++)剑指offer-26:二叉搜索树与双向链表(分解让复杂问题简单)
- 剑指Offer面试题-二叉搜索树与双向链表
- 剑指offer—二叉搜索树与双向链表
- 剑指Offer面试题26复杂链表的复制,面试题27二叉搜索树和双向链表(递归)
- 剑指offer 27. 二叉搜索树与双向链表
- 剑指offer_二叉树---二叉搜索树与双向链表
- 【剑指offer】之二叉搜索树转双向链表
- 【剑指offer-Java版】27二叉搜索树与双向链表
- 剑指offer面试题27-二叉搜索树转双向链表
- 剑指offer 27 二叉搜索树与双向链表
- 剑指offer-27二叉搜索树与双向链表
- 剑指offer之面试题27二叉搜索树与双向链表
- 【剑指offer】26二叉搜索树与双向链表
- 剑指offer 二叉搜索树以及双向链表
- 剑指offer:二叉搜索树与双向链表(java)
- 剑指offer面试题27:二叉搜索树与双向链表