题目描述:
二叉树数据结构TreeNode可用来表示单向链表(其中left置空,right为下一个链表节点)。实现一个方法,把二叉搜索树转换为单向链表,要求值的顺序保持不变,转换操作应是原址的,也就是在原始的二叉搜索树上直接修改。
返回转换后的单向链表的头节点。
方法一:根据二叉树的中序遍历将所有节点的left置空,将right指向下一个要遍历的节点
class Solution {
public TreeNode convertBiNode(TreeNode root) {
TreeNode head=null;
TreeNode tail=null;
Stack<TreeNode> stack=new Stack<>();
TreeNode node=root;
while(!stack.isEmpty()||node!=null){
while(node!=null){
stack.push(node);
node=node.left;
}
TreeNode tmp=stack.pop();
if(head==null){
head=tmp;
tail=tmp;
}else{
tail.right=tmp;
tail=tail.right;
}
tail.left=null;
node=tail.right;
}
return head;
}
}
方法二:递归,我们在树上进行中序遍历,但会将树中的节点之间重新连接而不使用额外的空间。具体地,当我们遍历到一个节点时,把它的左孩子设为空,并将其本身作为上一个遍历到的节点的右孩子。
class Solution {
TreeNode cur;
public TreeNode increasingBST(TreeNode root) {
TreeNode head=new TreeNode(-1);
cur=head;
dfs(root);
return head.right;
}
public void dfs(TreeNode root){
if(root!=null){
dfs(root.left);
root.left=null;
cur.right=root;
cur=root;
dfs(root.right);
}
}
}