先说二叉树的遍历,遍历方式:
- 前序遍历:先遍历根结点,然后左子树,再右子树
- 中序遍历:先遍历左子树,然后根结点,再右子树
- 后续遍历:先遍历左子树,然后右子树,再根结点
递归
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @return {number[]}
*/
var preorderTraversal = function(root) {
const nodeList = []
const proOrderTraverse = (node)=>{
if(!node) return
nodeList.push(node.val)
proOrderTraverse(node.left)
proOrderTraverse(node.right)
}
proOrderTraverse(root)
return nodeList
};
迭代
var preorderTraversal = function(root) {
const nodeList = []
const nodeStack = []
let node = root
while(nodeStack.length>0 || node){
while(node){
nodeList.push(node.val)
nodeStack.push(node)
node = node.left
}
node = nodeStack.pop()
node = node.right
}
return nodeList
};
morris
var preorderTraversal = function(root) {
const nodeList = []
let p1 = root, p2 = null
while(p1 != null){
p2 = p1.left
if(p2 != null){
while(p2.right != null && p2.right !=p1){
p2 = p2.right
}
if(p2.right == null){
nodeList.push(p1.val)
p2.right = p1
p1 = p1.left
continue
} else{
p2.right = null
}
}else {
nodeList.push(p1.val)
}
p1 = p1.right
}
return nodeList
};