题解 | #二叉搜索树与双向链表#

二叉搜索树与双向链表

http://www.nowcoder.com/practice/947f6eb80d944a84850b0538bf0ec3a5

大致思路就是利用二叉搜索树的中序非递归遍历,利用栈进行遍历二叉树,然后将遍历的结果存放到数组/list当中,之后我们只需要遍历数组/list,数组/list的下一位就是right,前一位就是left

/**
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}
*/
import java.util.*;
public class Solution {
    public TreeNode Convert(TreeNode pRootOfTree) {
        if(pRootOfTree==null){
            return pRootOfTree;
        }
      //一下是二叉树的中序非递归遍历
      //定义stack用于进行二叉树的非递归遍历
        Stack<TreeNode> stack = new Stack();
      //定义list存放有序的遍历的结果集
        ArrayList<TreeNode> list = new ArrayList();
      //定义cur保存当前元素
        TreeNode cur = pRootOfTree;
      //当前结点不为空或者栈不为空时进行中序遍历
        while(cur!=null || !stack.isEmpty()){
          //如果当前结点不为空就一直将cur=cur.left,遍历整个二叉树,直到cur为空,
          //说明遍历左子树结束
            while(cur!=null){
                stack.push(cur);
                cur = cur.left;
            }
          //在stack不为空时,将当前的栈顶出栈,此时cur=栈顶元素,然后将cur放入到list中,最后将当前结点右移,开始遍历右子树
            if(!stack.isEmpty()){
                cur = stack.pop();
                list.add(cur);
                cur = cur.right;
            }
        }
        
        //中序遍历结束后,list存放的实际上就是有序的结果集,然后我们只需要将
      //list中的当前元素的right指针指向下一位结点,下一位的left指针指向list的前一		//位元素
        for (int i=0;i<list.size()-1;i++){
            list.get(i).right=list.get(i+1);
            list.get(i+1).left=list.get(i);
        }
        
        //最后只需要返回list的首元素即可
        return list.get(0);
    }
}
全部评论

相关推荐

尊嘟假嘟点击就送:加v细说,问题很大
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务