当前位置: 首页 > news >正文

客户网站 备案徐州建设网站价格

客户网站 备案,徐州建设网站价格,百度联盟怎么做自己的网站,绿化工程属于建设工程吗文章目录一. 二叉树遍历的非递归实现1.先序非递归实现2.中序非递归实现3.后序非递归实现二、验证二叉树性质1.验证平衡二叉树2.验证二叉搜索树3.验证完全二叉树三. 完全二叉树的节点个数(时间复杂度低于O(n))一. 二叉树遍历的非递归实现 1.先序非递归实现 //思路:…

文章目录

  • 一. 二叉树遍历的非递归实现
    • 1.先序非递归实现
    • 2.中序非递归实现
    • 3.后序非递归实现
  • 二、验证二叉树性质
    • 1.验证平衡二叉树
    • 2.验证二叉搜索树
    • 3.验证完全二叉树
  • 三. 完全二叉树的节点个数(时间复杂度低于O(n))

一. 二叉树遍历的非递归实现

1.先序非递归实现

//思路: 使用栈模拟递归过程
//      先序:  根 左  右 ,为了先打印左再打印右,则需要右节点先入栈
public static void preOrder(TreeNode root) {Stack<TreeNode> s=new Stack<>();s.add(root);while(!s.isEmpty()) {//对头出队列TreeNode cur=s.pop();System.out.print(cur.val+" ");//先入右,再入左if(cur.right!=null) {s.add(cur.right);}if(cur.left!=null) {s.add(cur.left);}}
}

2.中序非递归实现

在这里插入图片描述

public static void inOrder(TreeNode root) {if(root!=null) {Stack<TreeNode> s=new Stack<>();//只要栈不为空或者root不为空,就不停止while(!s.isEmpty()||root!=null) {//只要节点root存在左孩子,就一直遍历左孩子if(root!=null) {s.push(root);     //遍历过程加入栈中root=root.left;   //到下一个左孩子}//如果root为空,即此时左孩子为空,则处理中间节点对头else {TreeNode cur=s.pop();  //队头出队System.out.print(cur.val+" ");root=cur.right;        //处理右孩子,右孩子重复左孩子的逻辑}}}
}

3.后序非递归实现

在这里插入图片描述

public static void posOrder(TreeNode root) {if(root!=null) {Stack<TreeNode> stack=new Stack<>();Stack<TreeNode> collect=new Stack<>();stack.push(root);while(!stack.isEmpty()) {root=stack.pop();collect.push(root);if(root.left!=null) {stack.push(root.left);}if(root.right!=null) {stack.push(root.right);}	}while(!collect.isEmpty()) {System.out.print(collect.pop().val+" ");}}
}
//实际上一个栈也可以实现: https://www.bilibili.com/video/BV1194y16727

二、验证二叉树性质

1.验证平衡二叉树

//思路: 以二叉树的最大深为基础,设置标记位,表示是否为平衡二叉树,
//      递归求左右子树高度的同时计算高度差,只有abs(差值)>1就修改标记为,且只能true->false
//时间复杂度: O(n)
public class BlanceTree {
public static boolean blance;public int height(TreeNode root) {if(root==null) return 0;int lh=height(root.left); //左树高int rh=height(root.right);//右树高if(Math.abs(lh-rh)>1) {   //计算高度差blance=false;}return 1+Math.max(lh,rh);
}
public boolean isBalanced(TreeNode root) {blance=true;   //由于blance为静态成员,因此每次都要置为初始值height(root);return blance;
}

2.验证二叉搜索树

	//详细解释: https://www.bilibili.com/video/BV1194y16727public static long min,max; //记录当前树cur的最小,最大值public boolean isValidBST(TreeNode root) {if(root==null) {//这样设置为了避免空节点的影响,使lmax<val<rminmin=Long.MAX_VALUE;max=Long.MIN_VALUE;}boolean lok=isValidBST(root.left); //左子树是否为搜索树//拿到左子树的最大,最小值long lmin=min;long lmax=max;boolean rok=isValidBST(root.right);//右子树是否为搜索树//拿到右子树的最大最小值long rmin=min;long rmax=max;//更新全局最小,最大值min=Math.min(Math.min(lmin,rmin),root.val);  max=Math.max(Math.max(lmax,rmax),root.val);return lok&&rok&&lmax<root.val&&rmin>root.val;}

3.验证完全二叉树

在这里插入图片描述

//方法一: 节点编号
public static int MAXN=101;
public static TreeNode[] queue=new TreeNode[MAXN];
//记录节点编号的数组
public static int[] pos=new int[MAXN];
public static int l,r;//树的一个特性: 编号,知道1个编号就可以指定孩子的编号 =》 只要编号不连续就不是完全二叉树
public boolean isCompleteTree3(TreeNode root) {l=r=0;queue[r]=root;pos[r++]=1;int prevIndex=0;while(l<r) {TreeNode cur=queue[l];int index=pos[l++];if(index!=prevIndex+1) {return false;}prevIndex=index;if(cur.left!=null) {queue[r]=cur.left;pos[r++]=2*index;}if(cur.right!=null) {queue[r]=cur.right;pos[r++]=2*index+1;}}return true;
}//方法二:
//数组模型队列
public boolean isCompleteTree2(TreeNode root) {l=r=0;boolean leaf=false;queue[r++]=root;while(l<r) {TreeNode cur=queue[l++];//不是完全二叉树的情况://  1.左孩子为空,但右孩子不为空   2.左空右不空,后面节点一定要是叶子节点if((cur.left==null&&cur.right!=null)||(leaf&&(cur.left!=null||cur.right!=null))) {return false;}if(cur.left!=null) {queue[r++]=cur.left;}if(cur.right!=null) {queue[r++]=cur.right;}if(cur.left==null||cur.right==null) {leaf=true;}}return true;
}

三. 完全二叉树的节点个数(时间复杂度低于O(n))

在这里插入图片描述
在这里插入图片描述

	//给定节点,计算该节点到最底层的高度,设初始高度为1public static int mostLeft(TreeNode cur,int level) {while(cur!=null) {level++;cur=cur.left;}return level-1;}//cur: 当前节点//h: 整颗完全二叉树的高度,不是当前节点到底部的高度//level: 当前节点所在的高度//dfs2: 计算当前节点cur的节点个数public static int dfs2(TreeNode cur,int level,int h) {if(level==h) return 1;   //如果cur在最后一层,即叶子节点,显然节点数为1if(mostLeft(cur.right, level+1)==h) { return (1<<(h-level))+dfs2(cur.right,level+1,h); //再以右孩子为根,因此level+1}else {return (1<<(h-level-1))+dfs2(cur.left,level+1,h);//再以右孩子为根,因此level+1}}public int countNodes2(TreeNode root) {if(root==null) {return 0;}return dfs2(root,1,mostLeft(root, 1));}

参考于:视频链接

http://www.dtcms.com/a/580639.html

相关文章:

  • 女孩学网站开发与运营方向怎么样网站asp模板
  • 一小时学做网站企业网站的功能主要有
  • 下列哪一项不属于电子商务网站建设福田时代汽车官方网站
  • 大连建设网站便民服务公司网站制作公司排名
  • 徐州营销型网站制使网页网站设计公司排名
  • 凡科自助建站平台建筑设计师用什么软件
  • 微信网站开发需要什么技术做网站切图
  • 嘉兴中元建设网站有效的引流推广方法
  • 买一个网站需要多少钱android
  • 哪个网站有学做吃的搜索引擎营销的优势
  • 揭阳网站制作多少钱perl做网站
  • 福州做网站设计微信投票小程序怎么做
  • 射阳网站建设如何制作app网站
  • 信息可视化网站公司介绍ppt模板免费下载
  • 网站主办者有效证件电子件二维码推广赚佣金平台
  • 速升网站外贸福步论坛登录
  • 做网站专用软件云小店自助下单
  • 专业建站公司收费标准如何做网站怎么赚钱吗
  • 重庆建网站 私单营销型网店与品牌型网店的区别
  • 数据系统网站建设必要性高端网站建设费用
  • 一起做的网站深圳建筑人才网官方网站
  • 国示建设网站江苏省建设协会网站
  • 个体网站建设教育培训网站排名
  • 做废旧回收哪个网站好网络建设与维护
  • 网站地址栏wordpress 后台拿shell
  • wap网站排名深圳网站关键词排名优化
  • 做网站会用到的色彩代码单词网站建设 上海
  • 网站案例比较多的公司网页升级访问新区域
  • o2o网站做推广公司ui设计师掌握技能
  • 广州微网站建设效果百度免费官网入口