二叉搜素树与双向链表(java版)

来源:互联网 发布:android 源码添加apk 编辑:程序博客网 时间:2024/06/05 09:21

【题目描述】输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。

注:不能创建新的结点,理解为不能显式的new一个出来。


【解题思路】
//1. 利用中序遍历的思想来完成。
//2. 给定一个指针用来存储中序遍历的第一个节点,作为双向链表的头指针。
//3. 对于遍历到的当前节点,若是第一个节点,则存储起来。否则,将上一个节点的右指针指向当前节点,将当前节点的左指针指向上一个节点。同时将当前节点存储为上一个节点,并继续遍历。

//递归实现public class Solution {    private TreeNode head;        //中序遍历中上一个节点    private TreeNode tail;        //记录中序遍历中第一个节点,即链表的头结点。    public TreeNode Convert(TreeNode pRootOfTree) {        inOrder(pRootOfTree);        return tail;    }    public void inOrder(TreeNode root){        if(root == null){            return;        }        if(root.left != null){            inOrder(root.left);        }        if(head == null){            head = root;            tail = root;        }else{            head.right = root;            root.left = head;            head = root;        }        if(root.right != null){            inOrder(root.right);        }    }}
//非递归实现import java.util.Stack;    public TreeNode ConvertBSTToBiList(TreeNode root) {        if(root==null)            return null;        Stack<TreeNode> stack = new Stack<TreeNode>();        TreeNode p = root;        TreeNode pre = null;// 用于保存中序遍历序列的上一节点        boolean isFirst = true;        while(p!=null||!stack.isEmpty()){            while(p!=null){                stack.push(p);                p = p.left;            }            p = stack.pop();            if(isFirst){                root = p;// 将中序遍历序列中的第一个节点记为root                pre = root;                isFirst = false;            }else{                pre.right = p;                p.left = pre;                pre = p;            }                   p = p.right;        }        return root;    }
原创粉丝点击