数据结构之二叉树1解析.ppt
文本预览下载声明
二叉树的基本术语 叶子 leaf :度为0的结点,也称为终端结点。 分支结点:度不为0的结点,也称为非终端结点或内部结点。 二叉树的基本术语 广度优先(逐层)遍历 队列实现广度优先遍历 template void LevelOrder BinaryTreeNode *t //对*t逐层遍历 BinaryTreeNode *p t; LinkedQueue BinaryTreeNode * Q; while p cout p- data;//访问p if p- LeftChild Q.Add p- LeftChild ; //将p的孩子放入队列 if p- RightChild Q.Add p- RightChild ; //访问下一个结点 if Q.IsEmpty return; else Q.Delete p ;//相当于p s.top ; s.pop ; 先序遍历递归算法 template void PreOrder BinaryTreeNode *t //对*t进行前序遍历 if t cout t- data; //访问根结点 PreOrder t- LeftChild ; //前序遍历左子树 PreOrder t- RightChild ; //前序遍历右子树 先序遍历的非递归实现 先序遍历的非递归实现 先序遍历的非递归实现 template void PreOrderTranverse BinaryTreeNode *t Stack BinaryTreeNode * s 20 ; BinaryTreeNode *p; p t; s.add p ; while !s.IsEmpty s.delete p ;//相当于p s.top ; s.pop ; cout p- data; if p- rightchild s.add p- rightchild ; if p- leftchild s.add p- leftchild ; 后序遍历的非递归实现算法 0. 将根节点作为当前节点 1.进栈过程: a 如果当前节点不空且具有左子树,将当前节点压入栈中,否则进入2 b 将当前节点的左子树的根节点设置为当前节点 c 重复a 2.出栈过程: a 如果当前节点不空且没有右子树,或者其右子树的根节点已经访问,访问之,否则进入3 b 若栈空,结束,否则取出当前栈顶节点作为当前节点 c 重复a 3.将当前节点压入栈中 4.将当前节点的右子树的根节点设为当前节点,重复1 后序遍历的非递归实现 二叉树操作算法举例 遍历二叉树是二叉树各种操作的基础,即很多操作可以在遍历过程中完成。 根据遍历算法的程序框架,可以派生出很多关于二叉树的应用算法,如求结点的双亲、结点的孩子,判定结点所在层次等,甚至可以在遍历过程中生成结点,建立二叉树的存储结构。 int CountLeaf BinaryTreeNode * root if root NULL return 0; else if root- lchild NULLroot- rchild NULL return 1; else return CountLeaf root- lchild + CountLeaf root- rchild ; bool search BinaryTreeNode * root, int k Using std::stack; //使用STL中的stack stack BinaryTreeNode * aStack; BinaryTreeNode * p root; while !aStack.empty || p if p aStack.push p ; //当前结点入栈 p p- Lchild; else p aStack.top ; // 返回栈顶 if p- data k return true; //找到关键值k的结点,返回true p p- Rchild; aStack.pop ; //栈顶元素退栈 return false; //查找完毕返回false template class BinaryTreeNode public: BinaryTreeNode LeftChild RightChild 0; BinaryTreeNode const T e data e; LeftChild RightChild 0; BinaryTreeNode const Te, BinaryTreeNode *l,BinaryTreeNode *r data e;
显示全部