public TreeNode recoverFromPreorder(String S) {
//利用栈来保存结点, 新遍历到的结点肯定是某一子节点(根结点除外),由于是先序遍历
//那么可能是上一个遍历结点的左孩子,要么是之前的已经遍历的右孩子
LinkedList<TreeNode> stack = new LinkedList<>();
int pos = 0;
while(pos<S.length()){
//首先拿到深度信息
int depth = 0;
while(pos<S.length() && S.charAt(pos) == '-'){
depth++;
pos++;
}
//再拿到结点信息
int value = 0;
while(pos<S.length() && S.charAt(pos) != '-'){
value = value*10 + S.charAt(pos) - '0';
pos++;
}
TreeNode node = new TreeNode(value);
if(depth == stack.size()){
if(!stack.isEmpty()){
stack.peek().left = node;
}
}else{//此时说明栈顶节点不是其父结点应该栈顶节点一直出栈 utill 满足条件
//用迭代模拟回溯
while(stack.size() != depth){
stack.pop();
}
stack.peek().right = node;
}
stack.push(node);
}
TreeNode root = null;
while(!stack.isEmpty()){
root = stack.pop();
}
return root;
}
leetcode 1028从先序遍历还原二叉树 迭代写法
最新推荐文章于 2024-02-29 17:31:53 发布