Leetcode--1028. 从先序遍历还原二叉树(Java)
我們從二叉樹的根節點 root?開始進行深度優先搜索。
在遍歷中的每個節點處,我們輸出?D?條短劃線(其中?D?是該節點的深度),然后輸出該節點的值。(如果節點的深度為 D,則其直接子節點的深度為 D + 1。根節點的深度為 0)。
如果節點只有一個子節點,那么保證該子節點為左子節點。
給出遍歷輸出?S,還原樹并返回其根節點?root。
?
示例 1:
輸入:"1-2--3--4-5--6--7"
輸出:[1,2,5,3,4,6,7]
示例 2:
輸入:"1-2--3---4-5--6---7"
輸出:[1,2,5,3,null,6,null,4,null,7]
示例 3:
輸入:"1-401--349---90--88"
輸出:[1,401,null,349,88,90]
提示:
原始樹中的節點數介于 1 和 1000 之間。
每個節點的值介于 1 和 10 ^ 9 之間。
思路:
利用棧
兩個相鄰的結點只可能存在兩種關系
1.后者是前者的左子節點
2.后者與前者無關,是更前面某一個節點的右子節點
/**
?*?Definition?for?a?binary?tree?node.
?*?public?class?TreeNode?{
?*?????int?val;
?*?????TreeNode?left;
?*?????TreeNode?right;
?*?????TreeNode(int?x)?{?val?=?x;?}
?*?}
?*/
class?Solution?{
????public?TreeNode?recoverFromPreorder(String?S)?{
????????if(S==null||S.length()==0){
????????????return?null;
????????}
????????Stack<TreeNode>?stack?=?new?Stack<>();
????????TreeNode?root?=?new?TreeNode(S.charAt(0)-'0');
????????int?index=0;
????????while(index<S.length()){
????????????int?level?=?0;
? ? ? ? ? //記錄當前找個節點處于第幾層(通過看他前面有幾條短線)
????????????while(S.charAt(index)=='-'){
????????????????index++;
????????????????level++;
????????????}
????????????int?value?=?0;
????????????while?(index?<?S.length()?&&?Character.isDigit(S.charAt(index)))?{
????????????????value?=?value?*?10?+?(S.charAt(index)?-?'0');
????????????????++index;
????????????}
????????????TreeNode?temp?=?new?TreeNode(value);
? ? ? ? ? ? //如果棧中節點遍歷到的層數和新節點處于的層數一樣,那么新節點是之前節點的左子節點,壓入棧中
????????????if(level==stack.size()){
????????????????if(!stack.isEmpty()){
????????????????????stack.peek().left?=?temp;
????????????????}
? ? ? ? ? ?//依次遍歷到新節點父親的層數,其他的出棧
????????????}else{
????????????????while(level!=stack.size()){
????????????????????stack.pop();
????????????????}
????????????????stack.peek().right=temp;
????????????}
????????????stack.push(temp);
????????}
? ? ?//有的結點可能未出棧,依次退棧,只留下樹根返回
????????while(stack.size()>1){
????????????stack.pop();
????????}
????????return?stack.peek();
????}
}
總結
以上是生活随笔為你收集整理的Leetcode--1028. 从先序遍历还原二叉树(Java)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Leetcode:892. 三维形体的表
- 下一篇: 【剑指offer】面试题57:和为s的两