本文主要包括樹相關的演算法,二叉樹結點基本結構如下
function treenode(x)
本文還會繼續更新。
function depth(proot)
var depth = 0;
var currdepth = 0;
dfs(proot);
return depth;
function dfs(node)
currdepth++;
dfs(node.left);
dfs(node.right);
currdepth--;
}}
function preorder(root)
}
function inorder(root)
}
function postorder(root)
}
/* function treenode(x) */
function printfromtoptobottom(root)
var queue = ;
queue.push(root);
var result = ;
while (queue.length)
if (temp.right)
}return result;
}
//層序的空節點使用 null
function tree(arr, node, num)
num = num || 1;
node = node || new treenode(arr[num - 1]);
var curr = node;
if(num * 2 - 1 < arr.length && arr[num * 2 - 1] != null)
if(num * 2 < arr.length && arr[num * 2] != null)
return node;
}
function rebuildtree_pi(pre, vin);
var index = vin.indexof(pre[0]);
var left = vin.slice(0,index);
var right = vin.slice(index+1);
var node = new treenode(vin[index]);
node.left = rebuildtree_pi(pre.slice(1,index+1),left);
node.right = rebuildtree_pi(pre.slice(index+1),right);
return node;
}
function rebuildtree_ip(vin, post);
var index = vin.indexof(post.pop());
var left = vin.slice(0,index);
var right = vin.slice(index+1);
var node = new treenode(vin[index]);
node.left = rebuildtree_ip(left, post.slice(0,index));
node.right = rebuildtree_ip(right, post.slice(index));
return node;
}
function maxdistance(root)
}
function mirror(root)
var temp = root.left;
root.left = root.right;
root.right = temp;
if(root.left)
if(root.right)
}
將左子樹構成雙向鍊錶,返回的是左子樹的尾結點,將其連線到root的左邊;將右子樹構成雙向鍊錶,將其追加到root結點之後,並返回尾結點;
向左遍歷返回的鍊錶至頭結點處,即為所求雙向鍊錶的首結點。
function convert(prootoftree)
var lastnode = null;
lastnode = convertnode(prootoftree);
var head = lastnode;
while(head && head.left)
return head;
function convertnode(node)
if(node.left)
node.left = lastnode;
if(lastnode)
lastnode = node;
if(node.right)
return lastnode;
}}
function isbalancedtree(proot)
var left = treedepth(proot.left);
var right = treedepth(proot.right);
var diff = left - right;
if(diff > 1 || diff < -1)
return false;
return isbalanced_solution(proot.left) && isbalanced_solution(proot.right);
function treedepth(proot)
var depth = 0;
var currdepth = 0;
dfs(proot);
return depth;
function dfs(node)
currdepth++;
dfs(node.left);
dfs(node.right);
currdepth--;}}
}
function issymmetrical(proot)
return symmetrical(proot, proot);
function symmetrical(node1,node2)
}
function isprefecttree(root)
while (que.length > 0)
return true;
}
function isfulltree(root)
while (que.length > 0)
return (nodenum & (nodenum + 1)) === 0;
}
function heap(ismaxheap)
heap.prototype = ,
// 檢視堆頂元素
peek: function () ,
// 新增乙個元素
add: function (val) else if (this.flag === false && parent > cur)
i = index;}},
_swap: function (i, j) ,
// 列印堆
show: function () ,
// 取出對頂元素
pop: function () else
if (maxindex !== i) else break;
}return res;
}};
基礎演算法之二叉樹 1 平衡二叉樹的判斷
平衡二叉樹指的是二叉樹的每乙個節點的左子樹和右子樹的高度差為不大於1 每乙個子樹如果有乙個出現不是平衡二叉樹的話就一定不是平衡二叉樹如果遍歷得到的某乙個節點出現了,二叉樹的高度之差大於1也不是二叉樹每次遍歷之後都要返回左右子樹的深度如果該節點滿足二叉樹的要求,該二叉樹的深度就是它下面最高的子樹的大小...
二叉樹之 二叉樹深度
二叉樹深度 獲取最大深度 public static int getmaxdepth treenode root 二叉樹寬度 使用佇列,層次遍歷二叉樹。在上一層遍歷完成後,下一層的所有節點已經放到佇列中,此時佇列中的元素個數就是下一層的寬度。以此類推,依次遍歷下一層即可求出二叉樹的最大寬度 獲取最大...
樹之二叉樹
二叉樹是每個結點最多有兩個子樹的有序樹。通常子樹的根被稱作 左子樹 left subtree 和 右子樹 right subtree 二叉樹常被用作二叉查詢樹和二叉堆或是二叉排序樹。滿二叉樹 在二叉樹的第i 層上有2 i 1 個結點,深度為k的二叉樹有2 k 1個結點的二叉樹。則此二叉樹稱為 滿二叉...