描述:二叉树数据结构TreeNode可用来表示单向链表(其中left置空,right为下一个链表节点)。实现一个方法,把二叉搜索树转换为单向链表,要求依然符合二叉搜索树的性质,转换操作应是原址的,也就是在原始的二叉搜索树上直接修改。
返回转换后的单向链表的头节点。
注意:本题相对原题稍作改动
示例:
输入: [4,2,5,1,3,null,6,0]
输出: [0,null,1,null,2,null,3,null,4,null,5,null,6]
提示:
节点数量不会超过 100000。
思路:最直观的想法是,中序遍历。由于中序遍历后,当前元素还需要指向下一个元素,故可以使用pre记录当前元素的中序前驱节点,那么当pre为空的时候,当前节点就是最左边的节点,即中序遍历的第一个节点,此时使用res记录下来,反之当pre不为空时,则将pre的右节点设置为当前节点,并且将pre设置为当前节点,此时一定注意,将pre的左节点设置为空要在将pre设置为当前节点之后(当前节点的左边已经遍历完啦,设置为空后,相当于为下一轮的pre的左节点设置为空,第一个本身是最左的节点,都不需要设置左节点为空)!!!
TreeNode* pre=NULL;
TreeNode* res=NULL;
void inorder(TreeNode* cur)
{
if(cur==NULL)
return;
inorder(cur->left);
//中
//最左方的一个节点
if(pre==NULL)
{
pre=cur;
res=pre;
}
else
{
pre->right=cur;
pre=cur;
pre->left=NULL; //注意这里 要在赋值为cur之后
}
inorder(cur->right);
}
TreeNode* convertBiNode(TreeNode* root)
{
//[4,2,5,1,3,null,6,0]
//[0,null,1,null,2,null,3,null,4,null,5,null,6]
//其实就是将二叉树按照中序遍历的结果转换为单向链表
if(!root)
return root;
if(!root->left&&!root->right)
return root;
inorder(root);
return res;
}
总结:当不太清楚二叉树的遍历变形写法时可以先把模板写出来再在对应地方更改!
补充:其实,在遍历完当前节点后再将左节点置为空也可以的!!
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* pre=NULL;
TreeNode* res=NULL;
void inorder(TreeNode* cur)
{
if(cur==NULL)
return;
inorder(cur->left);
//中
//最左方的一个节点
if(pre==NULL)
{
pre=cur;
res=pre;
}
else
{
pre->right=cur;
pre=cur;
}
inorder(cur->right);
cur->left=NULL;
}
TreeNode* convertBiNode(TreeNode* root) {
//[4,2,5,1,3,null,6,0]
//[0,null,1,null,2,null,3,null,4,null,5,null,6]
//其实就是将二叉树按照中序遍历的结果转换为单向链表
if(!root)
return root;
if(!root->left&&!root->right)
return root;
inorder(root);
return res;
}
};