We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
There was an error while loading. Please reload this page.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
144 二叉树的前序遍历 94 二叉树的中序遍历 145 二叉树的后序遍历 给你二叉树的根节点 root ,返回它节点值的 前、中/后序 遍历
思路3要理解!
很简单
前序
var preorderTraversal = function(root) { let ret=[]; let dfs=function(root){ if (!root) return //以下部分改变顺序 ret.push(root.val) dfs(root.left) dfs(root.right) } dfs(root) return ret };
中序
dfs(root.left) ret.push(root.val) dfs(root.right)
后序
dfs(root.left) dfs(root.right) ret.push(root.val)
参考 sl1673495/leetcode-javascript#50
把遍历可以分成三种操作:
前序遍历的顺序:把三种操作入栈
建立数据结构 {type,node} 来表示操作
{type,node}
type
n
getNode
v
getVal
node
var preorderTraversal = function(root) { if (!root) return [] let ret=[] let stack=[{ type:`n`, node:root }]; while (stack.length){ let {type,node}=stack.pop() if (type==='n'){ //改变这部分顺序可以实现前/中/后序遍历 if(node.right) stack.push({type:'n',node:node.right}) //右孩子入栈 if(node.left) stack.push({type:'n',node:node.left}) //左孩子入栈 stack.push({type:'v',node:node}) //值加入解集 } if (type==='v'){ ret.push(node.val) } } return ret };
中序 操作:左 中 右 入栈:右 中 左
if (type==='n'){ //改变这部分顺序可以实现前/中/后序遍历 if(node.right) stack.push({type:'n',node:node.right}) //右孩子入栈 stack.push({type:'v',node:node}) //值加入解集 if(node.left) stack.push({type:'n',node:node.left}) //左孩子入栈 }
后序 操作:左 右 中 入栈:中 右 左
if (type==='n'){ //改变这部分顺序可以实现前/中/后序遍历 stack.push({type:'v',node:node}) //值加入解集 if(node.right) stack.push({type:'n',node:node.right}) //右孩子入栈 if(node.left) stack.push({type:'n',node:node.left}) //左孩子入栈 }
The text was updated successfully, but these errors were encountered:
前=后,重点理解中
中 左 右 先找中
var preorderTraversal = function(root) { if (!root) return [] let ret=[] let stack=[root] while (stack.length){ root=stack.pop() ret.push(root.val) if(root.right)stack.push(root.right) if(root.left)stack.push(root.left) } return ret };
用一个栈 stack 和一个当前结点 root 来遍历:
stack
root
var inorderTraversal = function(root) { let ret=[] let stack=[] while(root||stack.length){ if (root){ stack.push(root) root=root.left } else { root=stack.pop() ret.push(root.val) root=root.right } } return ret };
先序:中 左 右 后序:左 右 中 可以直接用先序的方法做成 中 右 左,再反转结果成 左 右 中
var postorderTraversal = function(root) { if (!root) return [] let ret=[] let stack=[root] while (stack.length){ root=stack.pop() ret.push(root.val) if(root.left)stack.push(root.left) //注意这里顺序和前序相反 if(root.right)stack.push(root.right) } return ret.reverse() };
Sorry, something went wrong.
No branches or pull requests
Uh oh!
There was an error while loading. Please reload this page.
144 二叉树的前序遍历
94 二叉树的中序遍历
145 二叉树的后序遍历
给你二叉树的根节点 root ,返回它节点值的 前、中/后序 遍历
思路3要理解!
思路1:DFS递归
很简单
代码
前序
中序
后序
思路2 操作入栈,普适于前、中、后序遍历
参考 sl1673495/leetcode-javascript#50
把遍历可以分成三种操作:
前序遍历的顺序:把三种操作入栈
建立数据结构
{type,node}
来表示操作type
:表示操作类型,n
(getNode
)orv
(getVal
)node
:表示存储的结点相应地,其他顺序的遍历只要改变
n
和v
操作入栈的顺序就行代码
前序
中序
操作:左 中 右
入栈:右 中 左
后序
操作:左 右 中
入栈:中 右 左
The text was updated successfully, but these errors were encountered: