剑指offer-js编写-树
(1)
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
思路:首先找到A中结点的值与B相等的结点,然后从这两个相同的结点出发,判断是否存在重合,若是返回true。否则,在树A的左右子树中寻找与B结点值相同的结点,以这些结点出发递归判断是否是A的子树。
/* function TreeNode(x) {
this.val = x;
this.left = null;
this.right = null;
} */
function HasSubtree(pRoot1, pRoot2)
{
if(pRoot2 == null || pRoot1 == null ) {
return false;
}
var flag = false;
if(pRoot1.val == pRoot2.val) {
flag = subTree(pRoot1.left ,pRoot2.left) && subTree(pRoot1.right, pRoot2.right);
}
if(!flag) {
flag = HasSubtree(pRoot1.left, pRoot2) || HasSubtree(pRoot1.right, pRoot2);
}
return flag;
}
function subTree(pRoot1,pRoot2){ //判断以root1和root2开头的子数是否重合
if(pRoot2 == null) {
return true;
}
if(pRoot1 == null && pRoot2!=null) {
return false;
}
if(pRoot1.val == pRoot2.val){
return subTree(pRoot1.left ,pRoot2.left) && subTree(pRoot1.right, pRoot2.right);
}
return false;
}
(2)操作给定的二叉树,将其变换为源二叉树的镜像。
二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ 11 9 7 5
思路:二叉树的镜像树,通过上图可以看出,从根结点出发(先序遍历思想),先交换根结点的孩子,再依次递归交换左子树、右子数。
/* function TreeNode(x) {
this.val = x;
this.left = null;
this.right = null;
} */
function Mirror(root)
{
if(root==null){
return;
}
var temp=root.right;
root.right=root.left;
root.left=temp;
Mirror(root.left);
Mirror(root.right);
return root;
}
(3)从上往下打印出二叉树的每个节点,同层节点从左至右打印。
思路:二叉树的层次遍历,借用两个数组即可。
/* function TreeNode(x) {
this.val = x;
this.left = null;
this.right = null;
} */
function PrintFromTopToBottom(root)
{
var dequeTree=[]; //存放树中的结点
var result=[]; //保存结果
if(root==null){
return [];
}
dequeTree.push(root);
while(dequeTree.length){ //当dequeTree.length为0时,表明访问完书中的结点
pNode=dequeTree.shift();
result.push(pNode.val);
if(pNode.left)
dequeTree.push(pNode.left);
if(pNode.right)
dequeTree.push(pNode.right);
}
return result;
}
(4)输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
解析:对于一棵二叉排序树,存在特点:根结点的左子树都小于根结点,根结点的右子数都大于根结点。后序遍历最后访问的是根结点,因此,对于一个整数
数组,最后一个元素肯定是根结点,并且如果前部分(左子树)都小于最后一个元素(根结点),后部分(右子树)都大于最后一个元素(根结点)。递归判
断前部分和后部分是否是二叉排序树。
function VerifySquenceOfBST(sequence)
{
if(sequence.length==0){
return false;
}
return jurge(sequence,0,sequence.length-1);
function jurge(sequence,first,last){
if(first==last)
return true;
var max=sequence[last];
var temp1=first;
while(sequence[temp1]<max&&temp1<last){
temp1++;
}
temp1=temp1-1;
var temp2=temp1+1;
while(sequence[temp2]>max&&temp2<last){
temp2++;
}
if(temp2==last)
return true;
if(temp2!=last)
return false;
var a1=jurge(sequence,first,temp1);
var a2=jurge(sequence,temp1+1,last-1);
return a1&&a2;
}
}