(精)二叉树的周游.ppt

  1. 1、本文档共46页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
5.2.1 抽象数据类型 在二叉树的抽象数据类型中,定义了二叉树基本操作的集合,在具体应用中可以以此为基础进行扩充 为了强调抽象数据类型与存储无关,在此并没有具体规定该抽象数据类型的存储方式 5.2.2 深度优先周游二叉树 5.2.2 深度优先周游二叉树 基于二叉树的递归定义,这三种深度优先周游的递归定义 (1) 前序法(tLR次序,preorder traversal)。其递归定义是 访问根结点; 按前序周游左子树; 按前序周游右子树。 (2) 中序法(LtR次序,inorder traversal)。其递归定义是 按中序周游左子树; 访问根结点; 按中序周游右子树。 (3) 后序法(LRt次序,postorder traversal)。其递归定义是 按后序周游左子树; 按后序周游右子树; 访问根结点。 5.2.2 深度优先周游二叉树 深度周游如下二叉树 前序序列是:A B D E G C F H I 中序序列是:D B G E A C H F I 后序序列是:D G E B H I F C A 5.2.2 深度优先周游二叉树 二叉树的周游算法与表达式的“前缀”和“后缀”表示法之间有着密切的联系。例如图5.6是表达式A+B×(C+D)的二叉树表示。按照前序方式周游,运算符出现在前面,参与运算的对象紧跟在其后,这样就形成了前缀表达式(波兰式): + A × B + C D 按照中序方式周游,得到的结果是去掉括号的中缀表达式: A + B × C + D 下面是后序方式周游的结果,得到的是后缀表达式(逆波兰式): A B C D + × + 先序遍历递归算法 【算法5.3】 深度优先周游二叉树或其子树 templateclass T void BinaryTreeT::PreOrder (BinaryTreeNodeT *root) { // 前序周游二叉树或其子树 if (root != NULL) { Visit(root-value()); // 访问当前结点 PreOrder(root-leftchild()); // 前序周游左子树 PreOrder(root-rightchild()); // 前序周游右子树 } } 先序遍历的非递归实现 先序遍历的非递归实现 先序遍历的非递归实现 templateclass T void BinaryTreeT::PreOrderWithoutRecursion(BinaryTreeNodeT *root) { using std::stack; // 使用STL中的栈 stackBinaryTreeNodeT* aStack; BinaryTreeNodeT *pointer = root; aStack.push(NULL); // 栈底监视哨 while (pointer) { // 或者!aStack.empty() Visit(pointer-value()); // 访问当前结点 if (pointer-rightchild() != NULL) // 非空右孩子入栈 aStack.push(pointer-rightchild()); if (pointer-leftchild() != NULL) pointer = pointer-leftchild(); // 左路下降 else { // 左子树访问完毕,转向访问右子树 pointer=aStack.top(); // 获得栈顶元素 aStack.pop(); // 栈顶元素退栈 } } } 中序遍历

文档评论(0)

xiaofei2001129 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档