1. 節點個數
function getNodeNum(root){ if(root == null){ return 0; } //+1為root的計數 return getNodeNum(root.left) + getNodeNum(root.right) + 1; }
2. 葉子個數
function getLeafNum(root){ if(root == null){ return 0; } if(root.left == null && root.right == null){ return 1; } return getLeafNum(root.left) + getLeafNum(root.right); }
3. 第K層節點個數
//遞迴方法 function getLevelKNum(root,k){ if(root == null || k < 1){ return 0; } if(k == 1){ return 1; } return getLevelKNum(root.left,k-1) + getLevelKNum(root.right,k-1); } //非遞迴方法,使用層次遍歷,記錄每層的節點個數,到達第K層時,返回節點個數 function getLevelKNum2(root,k){ if(root == null){ return; } var queue = []; var level = 1; queue.push(root); while(queue.length > 0){ var levelSize = queue.length; if(level == k){ return levelSize; } while(levelSize > 0){ var node = queue.shift(); if(node.left){ queue.push(node.left) } if(node.right){ queue.push(node.right) } levelSize--; } level++; } return 0; }
4. 二叉樹的最低公共節點,判斷節點在左右兩側,則根節點(可能為子樹根)為最小公共節點,否則在左子樹或右子樹中遞迴查詢公共節點
function getLastCommonParent(root,node1,node2){ if(findNode(root.left,node1)){ if(findNode(root.right,node2)){ return root; } else{ return getLastCommonParent(root.left,node1,node2); } } else{ if(findNode(root.left,node2)){ return root; } else{ return getLastCommonParent(root.right,node1,node2); } } } function findNode(root,node){ if(root == null || node == null){ return false; } if(root == node){ return true; } return findNode(root.left,node) || findNode(root.right,node); }