ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

迭代法求从根到叶的二进制数之和

迭代法求从根到叶的二进制数之和 迭代我们用栈来模拟递归同时使用一个 prev 指针来记录先前访问的节点。算法步骤如下我们用栈来模拟递归同时使用一个 prev 指针来记录先前访问的节点。算法步骤如下如果节点 root 非空我们将不断地将它及它的左节点压入栈中。我们从栈中获取节点该节点的右节点为空或者等于 prev 说明该节点的左子树及右子树都已经被访问我们将它出栈。如果该节点是叶子节点我们将它对应的数字 val 加入结果中。设置 prev 为该节点设置 root 为空指针。该节点的右节点非空且不等于 prev ,我们令 root 指向该节点的右节点。3.如果 root 为空指针或者栈空中止算法否则重复步骤 1。需要注意的是每次出入栈都需要更新 val 。代码Python3class Solution: def sumRootToLeaf(self, root: Optional[TreeNode]) - int: ans val 0 st [] pre None while root or st: while root: val (val 1) | root.val st.append(root) root root.left root st[-1] if root.right is None or root.right pre: if root.left is None and root.right is None: ans val val 1 st.pop() pre root root None else: root root.right return ansJavaclass Solution { public int sumRootToLeaf(TreeNode root) { DequeTreeNode stack new ArrayDequeTreeNode(); int val 0, ret 0; TreeNode prev null; while (root ! null || !stack.isEmpty()) { while (root ! null) { val (val 1) | root.val; stack.push(root); root root.left; } root stack.peek(); if (root.right null || root.right prev) { if (root.left null root.right null) { ret val; } val 1; stack.pop(); prev root; root null; } else { root root.right; } } return ret; } }Cclass Solution { public: int sumRootToLeaf(TreeNode* root) { stackTreeNode * st; int val 0, ret 0; TreeNode *prev nullptr; while (root ! nullptr || !st.empty()) { while (root ! nullptr) { val (val 1) | root-val; st.push(root); root root-left; } root st.top(); if (root-right nullptr || root-right prev) { if (root-left nullptr root-right nullptr) { ret val; } val 1; st.pop(); prev root; root nullptr; } else { root root-right; } } return ret; } };复杂度分析时间复杂度O(n) 其中 n 是节点数目。总共访问 n 个节点。空间复杂度O(n) 。栈最多压入 n 个节点。
返回列表