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

建立一个网站如何开通账号网站开发工作好找吗

建立一个网站如何开通账号,网站开发工作好找吗,网站建设 智能建站,站长统计官网用了递归遍历,关于树的经典例题。 题目 递归 常规做法即递归了,不会写也得背下来。递归可以大致理解方法调用自身,先写中序遍历递归的方法,递归一定要有递归出口,当遍历到节点为空时返回,即已经找到了。…

用了递归遍历,关于树的经典例题。

题目

递归 

常规做法即递归了,不会写也得背下来。递归可以大致理解方法调用自身,先写中序遍历递归的方法,递归一定要有递归出口,当遍历到节点为空时返回,即已经找到了。可以看一下为什么是这三行,中序遍历为左中右顺序,那就可以先从根节点一直往左边找,直到找到最左边的节点,这是“递”,然后到了这个节点时第一个inorder就会return,即开始“归”了,返回上一个inorder是不是就是该节点了,直接下一步add将当前节点值加进list集,然后下一个inorder就是遍历右边的节点了,当然这时右边有节点也会一直遍历下去,然后这里的顺序还是符合中序遍历,因为每次执行add时都是把当前节点为根节点,这样递归反复,在当前节点的左节点会在上一步返回先,在当前节点的右节点也会在该节点进入list集后在下一步返回。然后在另一个方法引入,返回list集即可。

时间复杂度:O(n),空间复杂度:O(n)。 

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public List<Integer> inorderTraversal(TreeNode root) {List<Integer> res = new ArrayList<Integer>();inorder(root, res);return res;}public void inorder(TreeNode root, List<Integer> res) {if (root == null) {return;}inorder(root.left, res);res.add(root.val);inorder(root.right, res);}
}

循环 

那要是不用递归怎么写,上述其实也可以看作是一个模拟栈,递归的时候隐式地维护了一个栈,而我们在迭代的时候需要显式地将这个栈模拟出来,用循环能让这个栈更明显。先用外循环看看这个栈是否为空,节点非空也即要遍历的节点,然后下一个节点又是节点非空,把当前节点压入栈,指针左移,不断找左节点入栈,直到节点空了即找不到了,该循环结束,然后就开始出栈。出栈时位于栈顶的元素先出,即最左的元素先出,加进结果集后,指针右移,继续寻找右边的节点看看能否进行出栈,然后如此反复,就又是一个中序遍历了,思路是跟递归是差不多的。不想写多一个whlie,就把while改为if然后后面几行用else括住也能达到类似的效果。

时间复杂度:O(n),空间复杂度:O(n)。

class Solution {public List<Integer> inorderTraversal(TreeNode root) {List<Integer> res = new ArrayList<Integer>();Deque<TreeNode> stk = new LinkedList<TreeNode>();while (root != null || !stk.isEmpty()) {while (root != null) {stk.push(root);root = root.left;}//一直往左找root = stk.pop();res.add(root.val);root = root.right;//指针右移}return res;}
}

Morris 中序遍历 

不使用任何辅助空间,用上前驱节点,省去了栈的空间复杂度。先把根节点及根节点的右节点部分看成一大块连到根节点的左节点部分的最右节点上,然后以这样的方式反复拆分,左节点就会在前面先遍历,像链表一样的顺序,不过改变了整个树的结构。

时间复杂度:O(n),空间复杂度:O(1)。

class Solution {public List<Integer> inorderTraversal(TreeNode root) {List<Integer> res = new ArrayList<Integer>();TreeNode pre = null;while(root!=null) {//如果左节点不为空,就将当前节点连带右子树全部挂到//左节点的最右子树下面if(root.left!=null) {pre = root.left;while(pre.right!=null) {pre = pre.right;}pre.right = root;//将root指向root的leftTreeNode tmp = root;root = root.left;tmp.left = null;//左子树为空,则打印这个节点,并向右边遍历	} else {res.add(root.val);root = root.right;}}return res;}
}

当不想改变树的结构时,也可以进行链表的模拟,当遍历完后,将前驱节点的指针恢复即可。

class Solution {public List<Integer> inorderTraversal(TreeNode root) {List<Integer> res = new ArrayList<Integer>();TreeNode pre = null;while (root != null) {if (root.left != null) {// pre 节点就是当前 root 节点向左走一步,然后一直向右走至无法走为止pre = root.left;while (pre.right != null && pre.right != root) {pre = pre.right;}// 让 pre 的右指针指向 root,继续遍历左子树if (pre.right == null) {pre.right = root;root = root.left;}// 说明左子树已经访问完了,我们需要断开链接else {res.add(root.val);pre.right = null;root = root.right;}}// 如果没有左孩子,则直接访问右孩子else {res.add(root.val);root = root.right;}}return res;}
}

 像树这种结构很适合用递归循环实现。

http://www.yayakq.cn/news/201238/

相关文章:

  • 中卫网站推广公司网站静态模板下载
  • 拼团购物网站怎么做wordpress 插件 后门
  • 天津网站建设哪家权威山东莱芜金点子电子版
  • 狮城app更多网站万网是干什么用的
  • wordpress新用户站点山东公司网页定制
  • 网站 目标天津商业网站建设
  • wordpress 复杂开发wordpress seo title
  • 企业网站开发项目策划书基本框架51网站空间相册在哪里
  • 浙江标力建设集团网站wordpress自动发卡
  • 网站主页设计布局企业网站开发设计
  • 和城乡建设部网站韩国网页设计欣赏
  • 免费域名 网站外贸谷歌优化
  • 从做系统后以前的网站打不开了东莞网络公司代理
  • 类似非小号的网站怎么做简历设计网官网
  • 有没有做婚车的网站为什么建设旅游网站
  • md5加密网站全网营销心得体会
  • 平面设计师兼职网站app手机电视网站设计方案
  • 网站建设规划方案ppt模板他人盗用公司资料建设网站怎么处理
  • 哪个网站做美食好一点软件开发的一般方法步骤
  • 重庆整站seo娱乐彩票网站建设制作
  • 中国建设部官方网站证件查询小米路由器建设网站
  • 做网站如何防止被抄袭江苏扬州建设局网站
  • 一个公司做两个网站有影响吗正版素材网站
  • 安徽网站建设调查报告域名出售后被用来做非法网站
  • 网站建设 百度文库网站系统维护中
  • 医疗器械网站素材封面设计网站
  • mvc 网站建设erp系统可以自学吗
  • 知名网站服务器广州购物商城网站开发
  • 六安网站推广获客app繁昌县网站开发
  • 美食网站建设实施方案工程公司需要哪些资质证书