剑指offer第26题
/** * 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。 * 要求不能创建任何新的结点,只能调整树中结点指针的指向。 * <p> * 思路 * 方式一 * 1、先按中序遍历,把节点存入list * 2、再把list的节点连接成双向链表 * <p> * 方式二 * 中序遍历时直接指向 */ public class Solution26 { // public TreeNode Convert(TreeNode pRootOfTree) { // if (pRootOfTree == null) { // return null; // } // ArrayList<TreeNode> arrayList = new ArrayList<>(); // ArrayList<TreeNode> list = inOrder(pRootOfTree, arrayList); // return convert(list); // } // // private ArrayList<TreeNode> inOrder(TreeNode pRootOfTree, ArrayList<TreeNode> arrayList) { // if (pRootOfTree.left != null){ // inOrder(pRootOfTree.left,arrayList); // } // arrayList.add(pRootOfTree); // if (pRootOfTree.right != null){ // inOrder(pRootOfTree.right,arrayList); // } // return arrayList; // } // // private TreeNode convert(ArrayList<TreeNode> list) { // TreeNode head = new TreeNode(0); // TreeNode curr = head; // for (int i = 0; i < list.size(); i++) { // curr.right = list.get(i).left; // list.get(i+1).left = list.get(i).right; // curr = curr.right; // } // return head.right; // } TreeNode tail; TreeNode head; public TreeNode Convert(TreeNode pRootOfTree) { if (pRootOfTree == null) { return pRootOfTree; } convert(pRootOfTree); return head; } public void convert(TreeNode root) { if (root == null) { return; } convert(root.left); if (head == null) { head = root; tail = root; } else { tail.right = root; root.left = tail; tail = root; } convert(root.right); } }
Linux等环境软件安装