您的位置:首页 > Web前端

剑指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);
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: