题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
思路:
- 1.二叉搜索树,所以他的中序排序就是按大小排序的;
- 2.新建一个集合,将中序排序结果全部加到集合中;
- 3.修改节点的指针
代码:
public TreeNode Convert(TreeNode pRootOfTree) { if (pRootOfTree == null) { return pRootOfTree; } ArrayList<TreeNode> list = new ArrayList<>(); // 中序排序,将所有节点加入到集合中 getOrderedList(pRootOfTree, list); return modify(list); } // 修改各节点的指针 private TreeNode modify(ArrayList<TreeNode> list) { int len = list.size(); TreeNode node = list.get(0); // 第一个节点的左节点为空 node.left = null; TreeNode first = node; for (int i = 1; i < len; i++) { // 节点右节点指向当前节点 node.right = list.get(i); // 节点右移至当前节点 node = node.right; // 节点左节点关联前一个节点 node.left = list.get(i-1); } // 最后节点的右节点为空 node.right = null; return first; } private void getOrderedList(TreeNode pRootOfTree, ArrayList<TreeNode> list) { if (pRootOfTree.left != null) { getOrderedList(pRootOfTree.left,list); } list.add(pRootOfTree); if (pRootOfTree.right != null){ getOrderedList(pRootOfTree.right, list); } }