赞
踩
为了建立一棵二叉树,将二叉树中每个结点的空指针引出一个虚结点,将其指定为“#”,以标识其为空,把这样处理后的二叉树称为原二叉树的扩展二叉树。
设二叉树中的结点均为一个字符,假设扩展二叉树的前序遍历序列有键盘输入,root为指向跟结点的指针,二叉链表的建立过程是:首先输入根节点,若输入的是一个“#”字符,则表明该二叉树为空树,也就是root=NULL;否则输入的字符应该赋给root->data,之后依次递归建立它的左右子树
void creat_tree(treenode*& root)
{
char ch;
ch = getchar();
if ('#' == ch) {
root = NULL;
}
else {
root = new treenode;
root->data = ch;
creat_tree(root->left);
creat_tree(root->right);
}
}
前、中、后序遍历实质上都是递归算法的运用,他们之间的区别仅仅是语句执行前后的区别罢了。前序的语句顺序是:输出根节点,访问左子树,访问右子树;中序的语句顺序是:访问左子树,输出根节点,访问右子树;后序的语句顺序是:访问左子树,访问右子树,输出根节点
如果按前序遍历来输出该二叉树的话,结果为ABDGCEF;若为中序遍历,结果为:DGBAECF;若为后序遍历,结果为:GDBEFCA
代码实现为:
void preOrder(TreeNode* root) { if (root == NULL) return; cout << root->data; preOrder(root->lchild); preOrder(root->rchild); } void midOrder(TreeNode* root) { if (root == NULL) return; midOrder(root->lchild); cout << root->data; midOrder(root->rchild); } void backOrder(TreeNode* root) { if (root == NULL) return;` backOrder(root->lchild); backOrder(root->rchild); cout << root->data; }
层序遍历更好理解,顾名思义就是一层一层的输出,在这里需要用到队列来实现此操作。依旧是上面的例子,上面那个二叉树一共有四层,第一层为A,第二层为B、C,第三层为D、E、F,第四层为G。所以上面的二叉树层序遍历的结果为ABCDEFG。想要实现层序遍历,首先要判断二叉树的根节点是否为空,如果根节点为空,则直接输出:此二叉树为空!;若不为空,则将二叉树的根节点入队,然后开始队列不为空的判断,在此判断(循环)中:输出此结点,并对他的左右子树进行判断,左右子树不为空则进入队列,为空则直接跳过,最后再将遍历过的结点出队,这样一次判断(循环)便完成了。
代码实现:
void floorOrder(treenode*& root) { deque <Node> c; if (root != NULL) { c.push_back(root);//根节点入队 } else { cout << "此二叉树为空!"; } while (!c.empty()) {//队列不为空判断 cout << c.front()->data; if (c.front()->left != NULL) {//左子树不为空,左子树入队 c.push_back(c.front()->left); } if (c.front()->right != NULL) {//右子树不为空,右子树入队 c.push_back(c.front()->right); } c.pop_front();//遍历过的结点出队 } }
#include<iostream> #include<stdlib.h> #include<deque> using namespace std; typedef struct treenode { char data; treenode* right; treenode* left; }*Node; void creat_tree(treenode*& root) { char ch; ch = getchar(); if ('#' == ch) { root = NULL; } else { root = new treenode; root->data = ch; creat_tree(root->left); creat_tree(root->right); } } void preOrder(treenode*& root) { if (root == NULL) return; cout << root->data; preOrder(root->left); preOrder(root->right); } void midOrder(treenode*& root) { if (root == NULL) return; midOrder(root->left); cout << root->data; midOrder(root->right); } void backOrder(treenode*& root) { if (root == NULL) return; backOrder(root->left); backOrder(root->right); cout << root->data; } void floorOrder(treenode*& root) { deque <Node> c; if (root != NULL) { c.push_back(root);//根节点入队 } else { cout << "此二叉树为空!"; } while (!c.empty()) {//队列不为空判断 cout << c.front()->data; if (c.front()->left != NULL) {//左子树不为空,左子树入队 c.push_back(c.front()->left); } if (c.front()->right != NULL) {//右子树不为空,右子树入队 c.push_back(c.front()->right); } c.pop_front();//遍历过的结点出队 } } int main() { treenode* root = NULL; cout << "请输入二叉树,空值以#代表:" << endl; creat_tree(root); cout << "层序遍历为:";floorOrder(root);cout << endl; cout << "前序遍历为:";preOrder(root);cout << endl; cout << "中序遍历为:";midOrder(root);cout << endl; cout << "后序遍历为:";backOrder(root);cout << endl; return 0; } //文中测试数据:ABD#G###CE##F##
测试结果如图:
本文来自大一的蒟蒻,大家多多给出见解,共同学习!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。