# 二叉树遍历方法详解

function Node(data , left,right){
this.data = data;
this.left = left;
this.right = right;
this.show = show;
function show(){
return this.data;
}

};

function Bst(){
this.root = null;
this.insert = insert;//插入
this.inOrder = inOrder;//中序遍历(升序)
this.inOrderDesc = inOrderDesc;//中序遍历(降序)
this.preOrder = preOrder;//先序遍历
this.postOrder = postOrder;//后续遍历
this.getMin = getMin;//最大值
this.getMax = getMax;//最小值
this.find = find;//查找值
this.remove = remove;//删除节点

this.count = count;//获取节点数量

/*

* 较大元素插入left，较小元素插入right

*/

function insert(data){
//创建一个新的节点
var newNode = new Node(data,null,null);
//判断是否存在根节点，没有将新节点存入
if(this.root == null){
this.root = newNode;
}else{
//获取根节点
var current = this.root;
var parent;
while(true){
//将当前节点保存为父节点
parent = current;
//将小的数据放在左节点
if(data < current.data){
//获取当前节点的左节点
//判断当前节点下的左节点是否有数据
current = current.left;
if(current == null){
//如果没有数据将新节点存入当前节点下的左节点
parent.left = newNode;
break;
}
}else{
current = current.right;
if(current == null){
parent.right = newNode;
break;
}
}
}
}
}
function inOrder(node){
var data = [];
_inOrder(node,data);
return data;
}
function inOrderDesc(node){
var data = [];
_inOrderDesc(node,data);
return data;
}
function preOrder(node){
var data = [];
_preOrder(node,data);
return data;
}
function postOrder(node){
var data = [];
_postOrder(node,data);
return data;
}
function _inOrder(node,data){
if(!(node == null)){
_inOrder(node.left,data);
data.push(node.show());
_inOrder(node.right,data);
}
}
function _inOrderDesc(node,data){
debugger;
if(!(node == null)){
_inOrderDesc(node.right,data);
data.push(node.show());
_inOrderDesc(node.left,data);
}
}
function _preOrder(node,data){
if(!(node == null)){
data.push(node.show());
_preOrder(node.left,data);
_preOrder(node.right,data);
}

}

function _postOrder(node,data){
if(!(node == null)){
_postOrder(node.left,data);
_postOrder(node.right,data);
data.push(node.show());
}
}
function getMin(){
var current = this.root;
while(!(current.left == null)){
current = current.left;
}
return current.data;
}
function getMax(){
var current = this.root;
while(!(current.right == null)){
current = current.right;
}
return current.data;
}
function find(data){
var current = this.root;
while(current != null){
if(data == current.data){
return current;
}else if(data < current.data){
current = current.left;
}else{
current = current.right;
}
}
return null;
}
function getSmallest(node){
var current = node;
while(!(current.left == null)){
current = current.left;
}
return current;
}
function remove(data){
root = removeNode(this.root,data);
}
function removeNode(node,data){
if(node == null){
return null;
}
if(data == node.data){
//如果没有只节点
if(node.left == null && node.right){
return null;
}
//如果没有左节点
if(node.left == null){
return node.right;
}
//如果没有右节点
if(node.right == null){
return node.left;
}
//有两节点
var tempNode = getSmallest(node.right);
node.data = tempNode.data;
node.right = removeNode(node.right,tempNode.data);
return node;
}else if(data < node.data){
node.left = removeNode(node.left,data);
return node;
}else{
node.right = removeNode(node.right,data);
return node;
}
}
function count(){
var counts = 0;
var current = this.root;
if(current == null){
return counts;
}
return _count(current,counts);
}
function _count(node,counts){
debugger;
if(!(node == null)){
counts ++;
counts = _count(node.left,counts);;
counts = _count(node.right,counts);
}
return counts;
}
}

03-25
01-09 322

10-31 2万+
10-13 6645
04-19 5万+
02-16 4731
08-24 5万+
02-25 1877
10-03 55
07-11 2万+
02-13 611
08-15 475