二叉树数据结构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。
code1:递归
/** * 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 { private: void inorder(TreeNode *root, TreeNode *&tmp_head ){ if(root == NULL) return ; inorder(root->left, tmp_head); tmp_head->right = root; root->left = NULL; tmp_head = root; inorder(root->right, tmp_head); } public: TreeNode* convertBiNode(TreeNode* root) { if(root == NULL) return NULL; TreeNode *head = new TreeNode(-1); TreeNode *tmp_head = head; inorder(root, tmp_head); return head->right; } };
code2:非递归
/** * 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* convertBiNode(TreeNode* root) { if(root == NULL) return NULL; TreeNode *head = new TreeNode(-1); TreeNode *tmp_head = head; stack<TreeNode *> stack; while(!stack.empty() || root){ if(root){ stack.push(root); root = root->left; } else{ root = stack.top(); stack.pop(); root->left = NULL; tmp_head->right = root; tmp_head = root; root = root->right; } } return head->right; } };