目錄
101.對稱二叉樹
100.相同的樹
572.另一棵樹的子樹
104.二叉樹的最大深度
559.N叉樹的最大深度
?111.二叉樹的最小深度
222.完全二叉樹的節點個數
110.平衡二叉樹?
257.二叉樹的所有路徑
101.對稱二叉樹
101. 對稱二叉樹
已解答
簡單
相關標簽
相關企業
給你一個二叉樹的根節點?root
?, 檢查它是否軸對稱。
示例 1:
輸入:root = [1,2,2,3,4,4,3]
輸出:true
示例 2:
輸入:root = [1,2,2,null,3,null,3]
輸出:false
提示:
- 樹中節點數目在范圍?
[1, 1000]
?內 -100 <= Node.val <= 100
進階:你可以運用遞歸和迭代兩種方法解決這個問題嗎?
這個整體的思路是去比較該節點的左右子樹是否可以翻轉,判斷左右節點的值后,比較左節點的左子樹與右節點的右子樹,以及左節點的右子樹與右節點的左子樹是否對稱
遞歸法:
/*** Definition for a binary tree node.* 二叉樹節點的定義* public class TreeNode {* int val; // 節點值* TreeNode left; // 左子節點* TreeNode right; // 右子節點* TreeNode() {} // 構造函數* TreeNode(int val) { this.val = val; } // 帶值的構造函數* TreeNode(int val, TreeNode left, TreeNode right) { // 帶值和子節點的構造函數* this.val = val;* this.left = left;* this.right = right;* }* }*/
class Solution {// 判斷是否對稱函數public boolean isSymmetric(TreeNode root) {// 調用遞歸函數比較左右子樹return compare(root.left, root.right);}// 遞歸比較左右子樹是否對稱public boolean compare(TreeNode left, TreeNode right) {// 如果左右子節點都為空,則對稱if (left == null && right == null) {return true;}// 如果左右子節點其中一個為空,另一個不為空,則不對稱if (left == null || right == null) {return false;}// 如果左右子節點的值不相等,則不對稱if (left.val != right.val) {return false;}// 遞歸比較左子節點的左子樹與右子節點的右子樹,以及左子節點的右子樹與右子節點的左子樹是否對稱boolean out = compare(left.left, right.right);boolean in = compare(left.right, right.left);// 如果左右子樹都對稱,則整體對稱return out && in;}
}
迭代法:
/*** 迭代法* 使用雙端隊列,相當于兩個棧*/public boolean isSymmetric2(TreeNode root) {Deque<TreeNode> deque = new LinkedList<>();deque.offerFirst(root.left);deque.offerLast(root.right);while (!deque.isEmpty()) {TreeNode leftNode = deque.pollFirst();TreeNode rightNode = deque.pollLast();if (leftNode == null && rightNode == null) {continue;}
// if (leftNode == null && rightNode != null) {
// return false;
// }
// if (leftNode != null && rightNode == null) {
// return false;
// }
// if (leftNode.val != rightNode.val) {
// return false;
// }// 以上三個判斷條件合并if (leftNode == null || rightNode == null || leftNode.val != rightNode.val) {return false;}deque.offerFirst(leftNode.left);deque.offerFirst(leftNode.right);deque.offerLast(rightNode.right);deque.offerLast(rightNode.left);}return true;}/*** 迭代法* 使用普通隊列*/public boolean isSymmetric3(TreeNode root) {Queue<TreeNode> deque = new LinkedList<>();deque.offer(root.left);deque.offer(root.right);while (!deque.isEmpty()) {TreeNode leftNode = deque.poll();TreeNode rightNode = deque.poll();if (leftNode == null && rightNode == null) {continue;}
// if (leftNode == null && rightNode != null) {
// return false;
// }
// if (leftNode != null && rightNode == null) {
// return false;
// }
// if (leftNode.val != rightNode.val) {
// return false;
// }// 以上三個判斷條件合并if (leftNode == null || rightNode == null || leftNode.val != rightNode.val) {return false;}// 這里順序與使用Deque不同deque.offer(leftNode.left);deque.offer(rightNode.right);deque.offer(leftNode.right);deque.offer(rightNode.left);}return true;}
100.相同的樹
100. 相同的樹
已解答
簡單
相關標簽
相關企業
給你兩棵二叉樹的根節點?p
?和?q
?,編寫一個函數來檢驗這兩棵樹是否相同。
如果兩個樹在結構上相同,并且節點具有相同的值,則認為它們是相同的。
示例 1:
輸入:p = [1,2,3], q = [1,2,3]
輸出:true
示例 2:
輸入:p = [1,2], q = [1,null,2]
輸出:false
示例 3:
輸入:p = [1,2,1], q = [1,1,2]
輸出:false
提示:
- 兩棵樹上的節點數目都在范圍?
[0, 100]
?內 -104 <= Node.val <= 104
/*** Definition for a binary tree node.* 二叉樹節點的定義* public class TreeNode {* int val; // 節點值* TreeNode left; // 左子節點* TreeNode right; // 右子節點* TreeNode() {} // 空構造函數* TreeNode(int val) { this.val = val; } // 帶值的構造函數* TreeNode(int val, TreeNode left, TreeNode right) { // 帶值和子節點的構造函數* this.val = val;* this.left = left;* this.right = right;* }* }*/
class Solution {// 判斷是否相同樹的函數public boolean isSameTree(TreeNode p, TreeNode q) {// 如果左右子節點都為空,則相同if (p == null && q == null) {return true;}// 如果左右子節點其中一個為空,另一個不為空,則不相同if (p == null || q == null) {return false;}// 如果左右子節點的值不相等,則不相同if (p.val != q.val) {return false;}// 遞歸比較左子節點的左子樹與右子節點的右子樹,以及左子節點的右子樹與右子節點的左子樹是否相同boolean left = isSameTree(p.left, q.left);boolean right = isSameTree(p.right, q.right);// 如果左右子樹都相同,則整體相同return left && right;}
}
572.另一棵樹的子樹
572. 另一棵樹的子樹
已解答
簡單
相關標簽
相關企業
提示
給你兩棵二叉樹?root
?和?subRoot
?。檢驗?root
?中是否包含和?subRoot
?具有相同結構和節點值的子樹。如果存在,返回?true
?;否則,返回?false
?。
二叉樹?tree
?的一棵子樹包括?tree
?的某個節點和這個節點的所有后代節點。tree
?也可以看做它自身的一棵子樹。
示例 1:
輸入:root = [3,4,5,1,2], subRoot = [4,1,2]
輸出:true
示例 2:
輸入:root = [3,4,5,1,2,null,null,null,null,0], subRoot = [4,1,2]
輸出:false
提示:
root
?樹上的節點數量范圍是?[1, 2000]
subRoot
?樹上的節點數量范圍是?[1, 1000]
-104 <= root.val <= 104
-104 <= subRoot.val <= 104
/*** Definition for a binary tree node.* 二叉樹節點的定義* public class TreeNode {* int val; // 節點值* TreeNode left; // 左子節點* TreeNode right; // 右子節點* TreeNode() {} // 空構造函數* TreeNode(int val) { this.val = val; } // 帶值的構造函數* TreeNode(int val, TreeNode left, TreeNode right) { // 帶值和子節點的構造函數* this.val = val;* this.left = left;* this.right = right;* }* }*/
class Solution {// 判斷是否子樹的函數public boolean isSubtree(TreeNode root, TreeNode subRoot) {// 如果根節點為空,則返回falseif (root == null) {return false;}// 判斷當前子樹是否與給定子樹相同,或者在左子樹或右子樹中是否存在相同子樹return isSameTree(root, subRoot) || isSubtree(root.left, subRoot) || isSubtree(root.right, subRoot);}// 判斷是否相同樹的函數public boolean isSameTree(TreeNode p, TreeNode q) {// 如果左右子節點都為空,則相同if (p == null && q == null) {return true;}// 如果左右子節點其中一個為空,另一個不為空,則不相同if (p == null || q == null) {return false;}// 如果左右子節點的值不相等,則不相同if (p.val != q.val) {return false;}// 遞歸比較左子節點的左子樹與右子節點的右子樹,以及左子節點的右子樹與右子節點的左子樹是否相同boolean left = isSameTree(p.left, q.left);boolean right = isSameTree(p.right, q.right);// 如果左右子樹都相同,則整體相同return left && right;}
}
104.二叉樹的最大深度
104. 二叉樹的最大深度
簡單
給定一個二叉樹?root
?,返回其最大深度。
二叉樹的?最大深度?是指從根節點到最遠葉子節點的最長路徑上的節點數。
示例 1:
輸入:root = [3,9,20,null,null,15,7]
輸出:3
示例 2:
輸入:root = [1,null,2]
輸出:2
提示:
- 樹中節點的數量在?
[0, 104]
?區間內。 -100 <= Node.val <= 100
廣度優先遍歷
/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val = val; }* TreeNode(int val, TreeNode left, TreeNode right) {* this.val = val;* this.left = left;* this.right = right;* }* }*/
class Solution {public int maxDepth(TreeNode root) {// 如果根節點為空,直接返回深度為0if (root == null) {return 0;}// 創建一個隊列用于輔助層序遍歷Queue<TreeNode> queue = new LinkedList<>();// 將根節點加入隊列queue.offer(root);int depth = 0;// 當隊列不為空時,繼續遍歷while (!queue.isEmpty()) {// 記錄當前層的節點數int size = queue.size();// 遍歷當前層的所有節點while (size-- > 0) {// 從隊列中取出一個節點TreeNode node = queue.poll();// 將當前節點的左子節點加入隊列(如果存在)if (node.left != null) {queue.offer(node.left);}// 將當前節點的右子節點加入隊列(如果存在)if (node.right != null) {queue.offer(node.right);}}depth++; // 深度加1}// 返回樹的最大深度return depth;}
}
深度優先遍歷
求深度可看做是求高度,通過遞歸的方式,結束條件是節點為空,返回高度為0,每一個節點求出子樹高度的最大值加一為該節點的高度,根節點的高度即為二叉樹的最大深度
/*** Definition for a binary tree node.* 二叉樹節點的定義* public class TreeNode {* int val; // 節點值* TreeNode left; // 左子節點* TreeNode right; // 右子節點* TreeNode() {} // 空構造函數* TreeNode(int val) { this.val = val; } // 帶值的構造函數* TreeNode(int val, TreeNode left, TreeNode right) { // 帶值和子節點的構造函數* this.val = val;* this.left = left;* this.right = right;* }* }*/
class Solution {// 計算二叉樹的最大深度函數public int maxDepth(TreeNode root) {// 如果根節點為空,樹的深度為0if (root == null) {return 0;}// 分別計算左右子樹的深度int leftHeight = maxDepth(root.left);int rightHeight = maxDepth(root.right);// 取左右子樹深度的最大值,并加上根節點的深度1,得到整棵樹的深度int height = Math.max(leftHeight, rightHeight) + 1;return height;}
}
559.N叉樹的最大深度
559. N 叉樹的最大深度
簡單
給定一個 N 叉樹,找到其最大深度。
最大深度是指從根節點到最遠葉子節點的最長路徑上的節點總數。
N 叉樹輸入按層序遍歷序列化表示,每組子節點由空值分隔(請參見示例)。
示例 1:
輸入:root = [1,null,3,2,4,null,5,6]
輸出:3
示例 2:
輸入:root = [1,null,2,3,4,5,null,null,6,7,null,8,null,9,10,null,null,11,null,12,null,13,null,null,14]
輸出:5
提示:
- 樹的深度不會超過?
1000
?。 - 樹的節點數目位于?
[0,?104]
?之間。
深度優先遍歷
/*
// Definition for a Node.
// 節點類的定義
class Node {public int val; // 節點值public List<Node> children; // 子節點列表// 構造函數public Node() {}// 帶值的構造函數public Node(int _val) {val = _val;}// 帶值和子節點列表的構造函數public Node(int _val, List<Node> _children) {val = _val;children = _children;}
};
*/class Solution {// 計算多叉樹的最大深度函數public int maxDepth(Node root) {// 初始化最大深度為0int max = 0;// 如果根節點為空,返回0if (root == null) {return 0;}// 遍歷子節點列表for (Node child : root.children) {// 遞歸計算子節點的最大深度,并更新最大值max = Math.max(max, maxDepth(child));}// 返回最大深度加上當前節點的深度1return max + 1;}
}
廣度優先遍歷
/*
// Definition for a Node.
// 節點類的定義
class Node {public int val; // 節點值public List<Node> children; // 子節點列表// 構造函數public Node() {}// 帶值的構造函數public Node(int _val) {val = _val;}// 帶值和子節點列表的構造函數public Node(int _val, List<Node> _children) {val = _val;children = _children;}
};
*/class Solution {// 計算多叉樹的最大深度函數public int maxDepth(Node root) {// 如果根節點為空,直接返回深度為0if (root == null) {return 0;}// 創建一個隊列用于輔助層序遍歷Queue<Node> queue = new LinkedList<>();// 將根節點加入隊列queue.offer(root);int depth = 0;// 當隊列不為空時,繼續遍歷while (!queue.isEmpty()) {// 記錄當前層的節點數int size = queue.size();// 遍歷當前層的所有節點while (size-- > 0) {// 從隊列中取出一個節點Node node = queue.poll();// 將當前節點的子節點加入隊列if (!node.children.isEmpty()) {for (Node child : node.children) {queue.offer(child);}}}depth++; // 深度加1}// 返回樹的最大深度return depth;}
}
?111.二叉樹的最小深度
111. 二叉樹的最小深度
簡單
給定一個二叉樹,找出其最小深度。
最小深度是從根節點到最近葉子節點的最短路徑上的節點數量。
說明:葉子節點是指沒有子節點的節點。
示例 1:
輸入:root = [3,9,20,null,null,15,7]
輸出:2
示例 2:
輸入:root = [2,null,3,null,4,null,5,null,6]
輸出:5
提示:
- 樹中節點數的范圍在?
[0, 105]
?內 -1000 <= Node.val <= 1000
廣度優先遍歷?
/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val = val; }* TreeNode(int val, TreeNode left, TreeNode right) {* this.val = val;* this.left = left;* this.right = right;* }* }*/
class Solution {public int minDepth(TreeNode root) {// 如果根節點為空,直接返回深度為0if (root == null) {return 0;}// 創建一個隊列用于輔助層序遍歷Queue<TreeNode> queue = new LinkedList<>();// 將根節點加入隊列queue.offer(root);int depth = 1;// 當隊列不為空時,繼續遍歷while (!queue.isEmpty()) {// 記錄當前層的節點數int size = queue.size();// 遍歷當前層的所有節點while (size-- > 0) {// 從隊列中取出一個節點TreeNode node = queue.poll();//如果當前節點的左右孩子都為空,直接返回最小深度if (node.left == null && node.right == null){return depth;}// 將當前節點的左子節點加入隊列(如果存在)if (node.left != null) {queue.offer(node.left);}// 將當前節點的右子節點加入隊列(如果存在)if (node.right != null) {queue.offer(node.right);}}depth++; // 深度加1}// 返回樹的深度return depth;}
}
深度優先遍歷?
這里的深度優先遍歷與求二叉樹的最大深度有不同的地方,要著重明白最小深度是指葉節點到根節點的距離
采用和求二叉樹最大深度的求法的話,會導致出現如下情況
故要對左子樹為空或者右子樹為空的情況單獨判斷
/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val = val; }* TreeNode(int val, TreeNode left, TreeNode right) {* this.val = val;* this.left = left;* this.right = right;* }* }*/
class Solution {/*** 計算二叉樹的最小深度*/public int minDepth(TreeNode root) {// 如果根節點為空,返回深度為0if (root == null) {return 0;}// 計算左子樹的最小深度int leftHeight = minDepth(root.left);// 計算右子樹的最小深度int rightHeight = minDepth(root.right);// 如果左子樹為空而右子樹不為空,返回右子樹的最小深度加上根節點深度if (root.left == null && root.right != null) {return rightHeight + 1;}// 如果右子樹為空而左子樹不為空,返回左子樹的最小深度加上根節點深度if (root.left != null && root.right == null) {return leftHeight + 1;}// 返回左右子樹最小深度的較小值加上根節點深度int result = Math.min(leftHeight, rightHeight) + 1;return result;}
}
222.完全二叉樹的節點個數
222. 完全二叉樹的節點個數
簡單
給你一棵?完全二叉樹?的根節點?root
?,求出該樹的節點個數。
完全二叉樹?的定義如下:在完全二叉樹中,除了最底層節點可能沒填滿外,其余每層節點數都達到最大值,并且最下面一層的節點都集中在該層最左邊的若干位置。若最底層為第?h
?層,則該層包含?1~?2h
?個節點。
示例 1:
輸入:root = [1,2,3,4,5,6]
輸出:6
示例 2:
輸入:root = []
輸出:0
示例 3:
輸入:root = [1]
輸出:1
提示:
- 樹中節點的數目范圍是
[0, 5 * 104]
0 <= Node.val <= 5 * 104
- 題目數據保證輸入的樹是?完全二叉樹
進階:遍歷樹來統計節點是一種時間復雜度為?O(n)
?的簡單解決方案。你可以設計一個更快的算法嗎?
利用完全二叉樹的性質。逐層找出完美二叉樹,通過公式求出節點個數返回
/*** 二叉樹節點的定義*/
class TreeNode {int val; // 節點值TreeNode left; // 左子節點TreeNode right; // 右子節點// 構造函數TreeNode() {}// 帶值的構造函數TreeNode(int val) {this.val = val;}// 帶值和子節點的構造函數TreeNode(int val, TreeNode left, TreeNode right) {this.val = val;this.left = left;this.right = right;}
}class Solution {/*** 計算二叉樹的節點數*/public int countNodes(TreeNode root) {// 如果根節點為空,返回0if (root == null) {return 0;}// 初始化左子樹和右子樹的高度為0,并找到最左邊和最右邊的葉節點int leftHeight = 0;int rightHeight = 0;TreeNode turnLeft = root;while (turnLeft != null) {turnLeft = turnLeft.left;leftHeight++;}TreeNode turnRight = root;while (turnRight != null) {turnRight = turnRight.right;rightHeight++;}// 如果左右子樹高度相等,說明是滿二叉樹,直接返回節點數if (leftHeight == rightHeight) {return (2 << (leftHeight - 1)) - 1; // 注意(2<<1) 相當于2^2,所以leftHeight要減一}// 如果左右子樹高度不相等,分別計算左右子樹的節點數int leftCount = countNodes(root.left);int rightCount = countNodes(root.right);// 返回左右子樹節點數加上當前節點return leftCount + rightCount + 1;}
}
110.平衡二叉樹?
110. 平衡二叉樹
簡單
給定一個二叉樹,判斷它是否是高度平衡的二叉樹。
本題中,一棵高度平衡二叉樹定義為:
一個二叉樹每個節點?的左右兩個子樹的高度差的絕對值不超過 1 。
示例 1:
輸入:root = [3,9,20,null,null,15,7]
輸出:true
示例 2:
輸入:root = [1,2,2,3,3,null,null,4,4]
輸出:false
示例 3:
輸入:root = []
輸出:true
提示:
- 樹中的節點數在范圍?
[0, 5000]
?內 -104 <= Node.val <= 104
深度優先遍歷?
計算左右子樹的高度,判斷左右子樹的高度差是否大于一
/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val = val; }* TreeNode(int val, TreeNode left, TreeNode right) {* this.val = val;* this.left = left;* this.right = right;* }* }*/
class Solution {/*** 判斷二叉樹是否平衡*/public boolean isBalanced(TreeNode root) {// 如果平衡函數返回-1,說明不平衡if (balanced(root) == -1) {return false;}// 否則說明平衡return true;}/*** 計算二叉樹的高度,如果不平衡則返回-1*/public int balanced(TreeNode root) {// 如果節點為空,高度為0if (root == null) {return 0;}// 計算左子樹的高度int leftHeight = balanced(root.left);// 如果左子樹不平衡,直接返回-1if (leftHeight == -1) {return -1;}// 計算右子樹的高度int rightHeight = balanced(root.right);// 如果右子樹不平衡,直接返回-1if (rightHeight == -1) {return -1;}// 如果左右子樹高度差超過1,說明不平衡,返回-1if (Math.abs(leftHeight - rightHeight) > 1) {return -1;}// 返回左右子樹中較大的高度加上當前節點的高度return Math.max(leftHeight, rightHeight) + 1;}
}
廣度優先遍歷
計算每個節點的高度,通過迭代遍歷判斷左右子樹的高度差是否大于一
class Solution {/*** 迭代法,效率較低,計算高度時會重復遍歷* 時間復雜度:O(n^2)*/public boolean isBalanced(TreeNode root) {if (root == null) {return true;}Stack<TreeNode> stack = new Stack<>();TreeNode pre = null;while (root!= null || !stack.isEmpty()) {while (root != null) {stack.push(root);root = root.left;}TreeNode inNode = stack.peek();// 右結點為null或已經遍歷過if (inNode.right == null || inNode.right == pre) {// 比較左右子樹的高度差,輸出if (Math.abs(getHeight(inNode.left) - getHeight(inNode.right)) > 1) {return false;}stack.pop();pre = inNode;root = null;// 當前結點下,沒有要遍歷的結點了} else {root = inNode.right;// 右結點還沒遍歷,遍歷右結點}}return true;}/*** 層序遍歷,求結點的高度*/public int getHeight(TreeNode root) {if (root == null) {return 0;}Deque<TreeNode> deque = new LinkedList<>();deque.offer(root);int depth = 0;while (!deque.isEmpty()) {int size = deque.size();depth++;for (int i = 0; i < size; i++) {TreeNode poll = deque.poll();if (poll.left != null) {deque.offer(poll.left);}if (poll.right != null) {deque.offer(poll.right);}}}return depth;}
}
257.二叉樹的所有路徑
257. 二叉樹的所有路徑
簡單
給你一個二叉樹的根節點?root
?,按?任意順序?,返回所有從根節點到葉子節點的路徑。
葉子節點?是指沒有子節點的節點。
示例 1:
輸入:root = [1,2,3,null,5]
輸出:["1->2->5","1->3"]
示例 2:
輸入:root = [1]
輸出:["1"]
提示:
- 樹中節點的數目在范圍?
[1, 100]
?內 -100 <= Node.val <= 100
迭代法
節點為空時直接返回,遞到葉子節點時將路徑存入結果集合中,沒遞到葉子節點的話,將現有的路徑傳入去訪問左右子節點。
/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val = val; }* TreeNode(int val, TreeNode left, TreeNode right) {* this.val = val;* this.left = left;* this.right = right;* }* }*/
class Solution {/*** 返回二叉樹所有從根到葉子的路徑*/public List<String> binaryTreePaths(TreeNode root) {List<String> result = new ArrayList<>();path(root, "", result);return result;}/*** 輔助函數,遞歸遍歷二叉樹并構建路徑*/public void path(TreeNode root, String path, List<String> result) {// 如果節點為空,直接返回if (root == null) {return;}// 構建當前路徑的字符串表示StringBuilder pathSB = new StringBuilder(path);pathSB.append(Integer.toString(root.val));// 如果當前節點是葉子節點,將路徑加入結果列表if (root.left == null && root.right == null) {result.add(pathSB.toString());} else {// 否則,繼續遞歸遍歷左右子樹pathSB.append("->"); // 添加箭頭分隔符path(root.left, pathSB.toString(), result);path(root.right, pathSB.toString(), result);}}
}
?層序遍歷
通過一個棧,節點和路徑同時入棧和出棧,同樣到葉子節點的話將路徑傳入結果集合中
class Solution {/*** 迭代法*/public List<String> binaryTreePaths(TreeNode root) {List<String> result = new ArrayList<>();if (root == null)return result;Stack<Object> stack = new Stack<>();// 節點和路徑同時入棧stack.push(root);stack.push(root.val + "");while (!stack.isEmpty()) {// 節點和路徑同時出棧String path = (String) stack.pop();TreeNode node = (TreeNode) stack.pop();// 若找到葉子節點if (node.left == null && node.right == null) {result.add(path);}//右子節點不為空if (node.right != null) {stack.push(node.right);stack.push(path + "->" + node.right.val);}//左子節點不為空if (node.left != null) {stack.push(node.left);stack.push(path + "->" + node.left.val);}}return result;}
}
?