剑指offer-js编写-树(2)

参考牛客网上面的解析

(1)给定一颗二叉搜索树,请找出其中的第k大的结点。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4。

思路:已知二叉搜索树的中序遍历就是有序序列,因此使用中序遍历思想,访问第K个结点即为所求的第K大的结点。

 

/* function TreeNode(x) {
this.val = x;
this.left = null;
this.right = null;
} */
function KthNode(pRoot, k)
{
var arr=[];
if(pRoot===null||k<1){
return null;
}
function midInorder(root){
if(root.left!==null){
midInorder(root.left);
}
arr.push(root);
if(root.right!==null){
midInorder(root.right);
}
}
midInorder(pRoot);
return arr[k-1];
}

(2)给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。

思路:首先知道中序遍历的规则是:左根右,然后作图

 

结合图,我们可发现分成两大类:1、有右子树的,那么下个结点就是右子树最左边的点;(eg:D,B,E,A,C,G) 2、没有右子树的,也可以分成两类,a)是父节点左孩子(eg:N,I,L) ,那么父节点就是下一个节点 ; b)是父节点的右孩子(eg:H,J,K,M)找他的父节点的父节点的父节点...直到当前结点是其父节点的左孩子位置。如果没有eg:M,那么他就是尾节点。

/*function TreeLinkNode(x){
this.val = x;
this.left = null;
this.right = null;
this.next = null;
}*/
function GetNext(pNode)
{
if(pNode==null)
return null;
if(pNode.right!=null){
var l=pNode.right.left;
var p1=pNode.right;
while(l!=null){
p1=l;
l=l.left;
}
return p1;
}
while(pNode.next!=null){
var p=pNode.next;
if(p.left==pNode){
return p;
}else{
pNode=pNode.next;
}

}
return null;
}

(3)请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。(二叉树的镜像在前面有介绍)

解析: 递归思想,如果一棵树根结点为空则返回true,否则递归判断左子树和右子数是否对称,对称即各从某一相同结点出发,判断一棵树的左结点和另一棵树的右节点是否相同、一棵树的右节点和另一棵树的左节点是否相同。

/* function TreeNode(x) {
this.val = x;
this.left = null;
this.right = null;
} */
function isSymmetrical(pRoot)
{
if(pRoot==null)
return true;
var left=pRoot.left;
var right=pRoot.right;
return isSameTree(left,right);

}
function isSameTree(lNode,rNode){
if(lNode==null&&rNode==null){
return true;
}else if(lNode==null||rNode==null){
return false;
}else if(lNode.val!=rNode.val){
return false;
}else{
return isSameTree(lNode.left,rNode.right)&&isSameTree(lNode.right,rNode.left);
}
}

(4)输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。

解析:递归求解:假如是空节点,则返回0;否则,原树的深度由左右子树中深度较的深度加1,为原树的深度。

/* function TreeNode(x) {
this.val = x;
this.left = null;
this.right = null;
} */
function TreeDepth(pRoot)
{
if(pRoot==null){
return 0;
}
var left=1+TreeDepth(pRoot.left);
var right=1+TreeDepth(pRoot.right);
return Math.max(left, right);
}

(5)输入一棵二叉树,判断该二叉树是否是平衡二叉树。
解析:递归遍历求节点的深度,深度之差超过1的则不是平衡二叉树

/* function TreeNode(x) {
this.val = x;
this.left = null;
this.right = null;
} */
function IsBalanced_Solution(pRoot)
{
if(pRoot === null) {
return true;
}
var left = TreeDepth(pRoot.left),
right = TreeDepth(pRoot.right);
var dif = left - right;
if(dif > 1 || dif < -1) {
return false;
}
return IsBalanced_Solution(pRoot.left) && IsBalanced_Solution(pRoot.right);
}
function TreeDepth(pRoot) {
if(!pRoot) {
return null;
}
var left = TreeDepth(pRoot.left),
right = TreeDepth(pRoot.right);
return Math.max(left,right) + 1;
}

 

posted @ 2017-09-03 18:29  入门级小菜  阅读(124)  评论(0编辑  收藏  举报