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

北京大兴最专业的网站建设公司最近最新新闻

北京大兴最专业的网站建设公司,最近最新新闻,广州比较好的网站建设哪家好,杭州网站建设有限公司理论基础 二叉树的定义形式有:节点指针和数组 在数组中,父节点的下标为i,那么其左孩子的下标即i*21,右孩子的下标即为i*22 二叉树的常见遍历形式有:前序遍历、后序遍历、中序遍历和层序遍历 前序遍历:二…

理论基础

二叉树的定义形式有:节点指针和数组

  • 在数组中,父节点的下标为i,那么其左孩子的下标即i*2+1,右孩子的下标即为i*2+2

二叉树的常见遍历形式有:前序遍历、后序遍历、中序遍历和层序遍历

  • 前序遍历:二叉树的节点遍历顺序为,根节点、左节点、右节点,常记为“根左右”
  • 同理后序遍历则为“左右根”,中序遍历则为“左根右”,其主要的区别在于“根节点”的遍历顺序
  • 但是注意,访问顺序和遍历顺序不是相同的概念,例如中序遍历应该理解为已访问过中节点,只是未处理它,需要优先处理它的左节点
  • 层序遍历:顾名思义,就是按照从根节点到叶节点、从左到右的顺序,一层一层地遍历节点

根据二叉树的定义不同,又可分为不同类型的二叉树,常见的有:

  • 满二叉树:只有度为0的结点和度为2的节点,并且度为0的结点都在同一层上。
  • 完全二叉树:整颗树(包括其每一棵子树)除了叶节点,其他每一个节点都有左右节点(节点不为空),同时要保证父子节点的顺序关系
  • 二叉搜索树:整颗树(包括其每一棵子树)都满足左节点 < 父节点,右节点 > 父节点的条件,其中序遍历的结果为递增序列。
  • 二叉平衡树:整颗树(包括其每一棵子树)每一个节点都满足|其左右节点的树的高度的差值| <= 1

更多有关二叉树的理论基础可查阅:《代码随想录》二叉树理论基础

对于二叉树的遍历在《代码随想录》中都有非常详细的解释,我也是阅读学习之后再来解题的,所以在下面的解题过程中就不加以赘述了,仅贴出实现不同遍历形式的程序代码。


递归遍历二叉树

Java解法(递归,前序遍历):

class Solution {public List<Integer> preorderTraversal(TreeNode root) {List<Integer> ans = new ArrayList<>();this.preorder(root, ans);return ans;}public void preorder(TreeNode root, List<Integer> list){if(null == root){return;}list.add(root.val);this.preorder(root.left, list);this.preorder(root.right, list);}
}

Java解法(递归,中序遍历):

class Solution {public List<Integer> inorderTraversal(TreeNode root) {List<Integer> ans = new ArrayList<>();this.inorder(root, ans);return ans;}public void inorder(TreeNode root, List<Integer> list){if(null == root){return;}this.inorder(root.left, list);list.add(root.val);this.inorder(root.right, list);}
}

Java解法(递归,后序遍历):

class Solution {public List<Integer> postorderTraversal(TreeNode root) {List<Integer> ans = new ArrayList<>();this.postorder(root, ans);return ans;}public void postorder(TreeNode root, List<Integer> list){if(null == root){return;}this.postorder(root.left, list);this.postorder(root.right, list);list.add(root.val);}
}

迭代遍历二叉树

Java解法(迭代,前序遍历):

class Solution {public List<Integer> preorderTraversal(TreeNode root) {List<Integer> ans = new ArrayList<>();this.preorder(root, ans);return ans;}public void preorder(TreeNode root, List<Integer> list){Stack<TreeNode> stack = new Stack<>();if(null != root) stack.push(root);while(!stack.isEmpty()){root = stack.pop();list.add(root.val);if(null != root.right) stack.push(root.right);if(null != root.left) stack.push(root.left);}}
}

Java解法(迭代,中序遍历):

class Solution {public List<Integer> inorderTraversal(TreeNode root) {List<Integer> ans = new ArrayList<>();this.inorder(root, ans);return ans;}public void inorder(TreeNode root, List<Integer> list){Stack<TreeNode> stack = new Stack<>();while(null != root || !stack.isEmpty()){if(null != root){stack.push(root);root = root.left;}else{root = stack.pop();list.add(root.val);root = root.right;}}}
}

Java解法(迭代,后序遍历):

class Solution {public List<Integer> postorderTraversal(TreeNode root) {List<Integer> ans = new ArrayList<>();this.postorder(root, ans);return ans;}public void postorder(TreeNode root, List<Integer> list){Stack<TreeNode> stack = new Stack<>();if(null != root) stack.push(root);while(!stack.isEmpty()){root = stack.pop();list.add(root.val);if(null != root.left) stack.push(root.left);if(null != root.right) stack.push(root.right);}Collections.reverse(list);}
}

我们发现迭代法实现的先中后序,其实风格也不是那么统一,除了先序和后序,有关联,中序完全就是另一个风格了,一会用栈遍历,一会又用指针来遍历。那么如何针对三种不同的遍历方式,使用迭代法是可以写出统一风格的代码?

统一迭代遍历二叉树【重点】

可以利用标记法来做到统一迭代:

  • 将访问的节点放入栈中,把要处理的节点也放入栈中但是要做标记。
  • 在这里,我们利用空指针来做标记,在要处理的节点放入栈之后,紧接着放入一个空指针作为标记。
  • 详细的解释和实现可以查阅:《代码随想录》二叉树的统一迭代法

Java解法(统一迭代,前序遍历):

class Solution {public List<Integer> preorderTraversal(TreeNode root) {List<Integer> ans = new ArrayList<>();this.preorder(root, ans);return ans;}public void preorder(TreeNode root, List<Integer> list){Stack<TreeNode> stack = new Stack<>();if(null != root) stack.push(root);while(!stack.isEmpty()){root = stack.peek();if(null != root){stack.pop(); // 需要先弹出节点,避免后续重复访问// 节点按照右左根的顺序进栈,后续出栈顺序为根左右(前序遍历)if(null != root.right) stack.push(root.right);if(null != root.left) stack.push(root.left);stack.push(root);stack.push(null); // 对需要处理的节点,在其后面跟上空指针作为标记}else{stack.pop(); // 遇到标记时,先弹出标记// 再弹出下一个节点进行处理root = stack.pop();list.add(root.val);}}}
}

Java解法(统一迭代,中序遍历):

class Solution {public List<Integer> inorderTraversal(TreeNode root) {List<Integer> ans = new ArrayList<>();this.inorder(root, ans);return ans;}public void inorder(TreeNode root, List<Integer> list){Stack<TreeNode> stack = new Stack<>();if(null != root) stack.push(root);while(!stack.isEmpty()){root = stack.peek();if(null != root){stack.pop(); // 需要先弹出节点,避免后续重复访问// 节点按照右根左的顺序进栈,后续出栈顺序为左根右(中序遍历)if(null != root.right) stack.push(root.right);stack.push(root);stack.push(null); // 对需要处理的节点,在其后面跟上空指针作为标记if(null != root.left) stack.push(root.left);}else{stack.pop(); // 遇到标记时,先弹出标记// 再弹出下一个节点进行处理root = stack.pop();list.add(root.val);}}}
}

Java解法(统一迭代,后序遍历):

class Solution {public List<Integer> postorderTraversal(TreeNode root) {List<Integer> ans = new ArrayList<>();this.postorder(root, ans);return ans;}public void postorder(TreeNode root, List<Integer> list){Stack<TreeNode> stack = new Stack<>();if(null != root) stack.push(root);while(!stack.isEmpty()){root = stack.peek();if(null != root){stack.pop();// 需要先弹出节点,避免后续重复访问// 节点按照根右左的顺序进栈,后续出栈顺序为左右根(后序遍历)stack.push(root);stack.push(null);// 对需要处理的节点,在其后面跟上空指针作为标记if(null != root.right) stack.push(root.right);if(null != root.left) stack.push(root.left);}else{stack.pop();// 遇到标记时,先弹出标记// 再弹出下一个节点进行处理root = stack.pop();list.add(root.val);}}}
}

二叉树结构也是在编程中常见的数据结构之一,例如堆其实就是一个树结构,以及哈希表中也运用到了红黑树来优化哈希表的存储结构等等。

通过今天的练习,我第一次了解并学习到了二叉树的统一迭代遍历算法,利用标记法来遍历二叉树的方法真的是非常巧妙,同时通过迭代算法的练习,也加深了对递归是如何模拟一个栈,以及递归算法如何转变为迭代算法有了一个初步的思路:

门径初窥书海奥, 欣喜若狂凯歌还。


文章转载自:
http://dinncomessaline.zfyr.cn
http://dinncointellectronics.zfyr.cn
http://dinncodemulsibility.zfyr.cn
http://dinncohedwig.zfyr.cn
http://dinncosoldierlike.zfyr.cn
http://dinncoarrhythmically.zfyr.cn
http://dinncosymbol.zfyr.cn
http://dinncolewisson.zfyr.cn
http://dinncocesspit.zfyr.cn
http://dinncoparotitis.zfyr.cn
http://dinncothalassic.zfyr.cn
http://dinncotranquilization.zfyr.cn
http://dinncojoyuce.zfyr.cn
http://dinncolibertarian.zfyr.cn
http://dinncoacierate.zfyr.cn
http://dinncoknockdown.zfyr.cn
http://dinncoobtund.zfyr.cn
http://dinncoweapon.zfyr.cn
http://dinncobullet.zfyr.cn
http://dinncovouvray.zfyr.cn
http://dinncomasjid.zfyr.cn
http://dinncoladderman.zfyr.cn
http://dinncohumanoid.zfyr.cn
http://dinncodeambulatory.zfyr.cn
http://dinncoperforator.zfyr.cn
http://dinncosynergist.zfyr.cn
http://dinncopripet.zfyr.cn
http://dinncomwa.zfyr.cn
http://dinncoandragogy.zfyr.cn
http://dinncosomeday.zfyr.cn
http://dinncocondensed.zfyr.cn
http://dinncopolarimetry.zfyr.cn
http://dinncolestobiotic.zfyr.cn
http://dinncobloodletting.zfyr.cn
http://dinnconailing.zfyr.cn
http://dinncobenthal.zfyr.cn
http://dinncodecant.zfyr.cn
http://dinncoemesis.zfyr.cn
http://dinncojilt.zfyr.cn
http://dinncorudd.zfyr.cn
http://dinncouprear.zfyr.cn
http://dinncohomozygosis.zfyr.cn
http://dinncodefinitely.zfyr.cn
http://dinncolamister.zfyr.cn
http://dinncoanglophile.zfyr.cn
http://dinncoafterhours.zfyr.cn
http://dinncoathleticism.zfyr.cn
http://dinncolossy.zfyr.cn
http://dinncovehicle.zfyr.cn
http://dinncodignity.zfyr.cn
http://dinncoroughneck.zfyr.cn
http://dinncolordliness.zfyr.cn
http://dinncoinstrumentally.zfyr.cn
http://dinncoinulase.zfyr.cn
http://dinncoseam.zfyr.cn
http://dinncoboutiquier.zfyr.cn
http://dinncolemonade.zfyr.cn
http://dinncobreugel.zfyr.cn
http://dinncotruffle.zfyr.cn
http://dinncolawd.zfyr.cn
http://dinncogermproof.zfyr.cn
http://dinncocupellation.zfyr.cn
http://dinncoimpolite.zfyr.cn
http://dinncocorroboree.zfyr.cn
http://dinncohotel.zfyr.cn
http://dinncoepipteric.zfyr.cn
http://dinncotribophysics.zfyr.cn
http://dinncostutterer.zfyr.cn
http://dinncotenderhearted.zfyr.cn
http://dinncoactress.zfyr.cn
http://dinncofoveolate.zfyr.cn
http://dinncorigor.zfyr.cn
http://dinncoenactory.zfyr.cn
http://dinncoforbiddance.zfyr.cn
http://dinncosernyl.zfyr.cn
http://dinncoepiscopate.zfyr.cn
http://dinncodreadless.zfyr.cn
http://dinncocornucopia.zfyr.cn
http://dinncorouble.zfyr.cn
http://dinncoroothold.zfyr.cn
http://dinncohorunspatio.zfyr.cn
http://dinncoforeworn.zfyr.cn
http://dinncoanglewing.zfyr.cn
http://dinncowashingtonologist.zfyr.cn
http://dinncogeochronology.zfyr.cn
http://dinncotimaru.zfyr.cn
http://dinncocrossline.zfyr.cn
http://dinncogast.zfyr.cn
http://dinncoshipwreck.zfyr.cn
http://dinncotransvenous.zfyr.cn
http://dinncotoweling.zfyr.cn
http://dinncollano.zfyr.cn
http://dinncoscannable.zfyr.cn
http://dinncoind.zfyr.cn
http://dinncoadscription.zfyr.cn
http://dinncocycling.zfyr.cn
http://dinncoinstrumentality.zfyr.cn
http://dinncocounterpiston.zfyr.cn
http://dinncoheathenise.zfyr.cn
http://dinncopillbox.zfyr.cn
http://www.dinnco.com/news/149340.html

相关文章:

  • 网址导航该如何推广哈尔滨seo优化公司
  • 机械厂网站建设方案百度小说排行榜前十
  • 大型平台网站开发西安市网站
  • 中国风格网站西安seo网络优化公司
  • 衣服网站模板信息流优化师简历模板
  • 深入解析 wordpress网络搜索引擎优化
  • 注册网站域名有什么用电子商务平台有哪些
  • 青岛网站开发企业seo行业岗位有哪些
  • 网站平台建设咨询合同seo怎么收费的
  • 用muse做网站求职seo服务
  • 2015微信网站苏州seo公司
  • 厦门做网站seo的重庆百度推广的代理商
  • 怎么做网站挣钱网络app推广是什么工作
  • 织梦网站主页文章列表调用营销策略有哪些方面
  • 做电源的网站新乡网络推广外包
  • 网上北京网站制作公司百度百家号
  • 网站建设推广安徽2023百度秒收录技术
  • oa网站建设价格seo优化seo外包
  • 哈密市建设局网站市场调研与分析
  • 做网站页面的需要哪些技巧郑州seo排名哪有
  • 做房地产要自己开网站免费网页代码大全
  • 企业网站开发到上线的视频百度云盘资源搜索
  • 南和县建设局黄页网站世界排名前十位
  • 最新网站源码下载百度网址提交入口平台
  • 石家庄做网站好的公司推荐企业网站建设方案
  • 网络兼职做网站今日山东新闻头条
  • 泰安市住房和城乡建设厅网站百度竞价怎么操作
  • Seo与网站推广的技术对比软文营销推广
  • 自助搭建网站系统外包优化网站
  • wordpress主要函数优化快速排名教程