题目的要求是将二叉搜索树转换成按顺序排列的双向链表!
有好几个思路,但是都是基于中序遍历实现的。所以中序遍历是关键。
思路一:将中序遍历的结果放入vector中,然后两次for循环添加前后指针。
思路二:直接把中序编列遇到的节点和并到链表中,这里分单向添加和双向添加两种情况(本文实现后一种)
/*
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 * plastnode = NULL;
//转换节点指针函数
Convertnode(pRootOfTree,&plastnode);
//再做个循环找到头节点
TreeNode *pheadoflist = plastnode;
while(pheadoflist !=NULL && pheadoflist->left!= NULL)
{
pheadoflist = pheadoflist ->left;
}
return pheadoflist;
}
//为了改变链表节点的值,这里传 指针的地址!
void Convertnode(TreeNode * pnode,TreeNode ** plastnode)
{
if(pnode == NULL)
return;
TreeNode *pcurrent =pnode;
if (pcurrent->left !=NULL)
Convertnode(pcurrent->left,plastnode);
pcurrent ->left = *plastnode; //这三步实现的双向添加
if(*plastnode !=NULL)
(*plastnode)->right =pcurrent;
*plastnode =pcurrent; //节点后移
if(pcurrent->right!=NULL)
Convertnode(pcurrent->right,plastnode);
}
};
python版本实现递归调用# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution: def Convert(self, pRootOfTree): if not pRootOfTree: return pRootOfTree if not pRootOfTree.left and not pRootOfTree.right: return pRootOfTree # 处理左子树 self.Convert(pRootOfTree.left) left=pRootOfTree.left # 连接根与左子树最大结点 if left: while(left.right): left=left.right # 可以看到这也是个双向插入的过程 pRootOfTree.left,left.right=left,pRootOfTree # 处理右子树 self.Convert(pRootOfTree.right) right=pRootOfTree.right # 连接根与右子树最小结点 if right: while(right.left): right=right.left pRootOfTree.right,right.left=right,pRootOfTree # 这个是找到头节点 while(pRootOfTree.left): pRootOfTree=pRootOfTree.left return pRootOfTree
本文介绍了一种将二叉搜索树转换为有序双向链表的方法。通过中序遍历,采用递归的方式调整节点间的连接,最终形成一个双向链表。文章提供了C++与Python两种语言的实现方案,并详细解释了核心算法步骤。
8703

被折叠的 条评论
为什么被折叠?



