输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
思路:二叉搜索树的中序遍历序列是递增的 所以就是二叉树的中序遍历
非递归:
import java.util.Stack; public class Solution { public TreeNode Convert(TreeNode pRootOfTree) { if(pRootOfTree == null){ return null; } Stack<TreeNode> stack=new Stack<>(); TreeNode p=pRootOfTree; TreeNode pre=null; boolean isFirst=true; while (p!=null || !stack.isEmpty()){ while (p != null){ stack.push(p); p = p.left; } if(!stack.isEmpty()){ p=stack.pop(); if(isFirst){ pRootOfTree = p; pre=pRootOfTree; isFirst=false; }else { p.left=pre; pre.right=p; pre=p; } p=p.right; } } return pRootOfTree; } }
递归:
import java.util.Stack; public class Solution { TreeNode pre=null; public TreeNode Convert(TreeNode pRootOfTree) { if(pRootOfTree == null){ return null; } ConvertCore(pRootOfTree); TreeNode root=pRootOfTree; while(root.left != null){ root = root.left; } return root; } public void ConvertCore(TreeNode cur){ if(cur == null){ return; } ConvertCore(cur.left); cur.left=pre; if (pre != null){ pre.right=cur; } pre=cur; ConvertCore(cur.right); } }