剑指offer 二叉搜索树与双向链表
问题描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
C++代码实现
思路:二叉搜索树特征,左<根<右。遍历每个结点,当前结点的左子树的最右下面的结点为前序结点,当前结点的右子树的最左下面的结点为后续结点,找到到改变指针指向。
注意:为了避免重复访问,设立一个访问数组。弊端:默认结点值都是整数
/*
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)
return NULL;
// 初始化访问数组
int visit[10000] = {0};
ConvertHelper(pRootOfTree, visit);
// 找到最前面的结点
while(pRootOfTree->left)
{
pRootOfTree = pRootOfTree->left;
}
return pRootOfTree;
}
void ConvertHelper(TreeNode* pRootOfTree, int visit[])
{
if (pRootOfTree)
{
// 标记访问当前结点已访问
visit[pRootOfTree->val] = 1;
auto left_child = pRootOfTree->left;
auto right_child = pRootOfTree->right;
auto p = left_child;
// 找到前序结点
if (p && visit[p->val] == 0)
{
while(p->right)
{
p = p->right;
}
p->right = pRootOfTree;
pRootOfTree->left = p;
}
// 找到后序结点
p = right_child;
if (p && visit[p->val] == 0)
{
while(p->left)
{
p = p->left;
}
pRootOfTree->right = p;
p->left = pRootOfTree;
}
if (left_child && visit[left_child->val] == 0)
{
ConvertHelper(left_child, visit);
}
if (right_child && visit[right_child->val] == 0)
{
ConvertHelper(right_child, visit);
}
}
}
};
python2代码实现
使用字典
# -*- coding:utf-8 -*-
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def Convert(self, pRootOfTree):
# write code here
if not pRootOfTree:
return None
d = {}
self.ConvertHelper(pRootOfTree, d)
while pRootOfTree.left:
pRootOfTree = pRootOfTree.left
return pRootOfTree
def ConvertHelper(self, pRootOfTree, d):
if pRootOfTree is not None:
d[pRootOfTree.val] = 1
left_child = pRootOfTree.left
right_child = pRootOfTree.right
p = left_child
if p and p.val not in d:
while p.right:
p = p.right
p.right = pRootOfTree
pRootOfTree.left = p
p = right_child
if p and p.val not in d:
while p.left:
p = p.left
pRootOfTree.right = p
p.left = pRootOfTree
if left_child and left_child.val not in d:
self.ConvertHelper(left_child, d)
if right_child and right_child.val not in d:
self.ConvertHelper(right_child, d)