题目描述
已知二叉链表类,请实现二叉树的先序、中序、后序递归遍历。
//OJ-1020 binary tree(1)
#include
#include
using namespace std;
//二叉树类,实现二叉树的递归算法:三种遍历
template
struct BiNode //二叉树的结点结构
{
DataType data;
BiNode
};
template
class BiTree{
public:
BiTree(); //构造函数,初始化一棵二叉树,其前序序列由键盘输入
~BiTree(); //析构函数,释放二叉链表中各结点的存储空间
void PreOrder(void); //调用私有的递归函数PerOrder
void InOrder(void);
void PostOrder(void);
private:
BiNode
void Creat(BiNode
void Release(BiNode
void PreOrder(BiNode
void InOrder(BiNode
void PostOrder(BiNode
};
//定义类中的成员函数
//构造函数:Creat利用创建二叉树
template
BiTree
{
Creat(root);
}
//功 能:递归方法创建一棵二叉树,由构造函数调用
template
void BiTree
{
DataType ch;
cin>>ch;
if (ch==”#”) bt = nullptr; //创建结点值为字符串的二叉树
else{
bt = new BiNode
bt->data=ch;
Creat(bt->lchild); //递归建立左子树
Creat(bt->rchild); //递归建立右子树
}
}
//功 能:析构函数,释放二叉链表中各结点的存储空间
template
BiTree
{
Release(root);
}
//功 能:释放二叉树的存储空间,析构函数调用
template
void BiTree
{
if (bt != nullptr){
Release(bt->lchild); //释放左子树
Release(bt->rchild); //释放右子树
delete bt;
}
}
template
void BiTree
{
PreOrder(root);
}
template
void BiTree
{
InOrder(root);
}
template
void BiTree
{
PostOrder(root);
}
//请在下面补充实现二叉树的三种递归遍历算法
int main()
{
BiTree
mybit.PreOrder();
cout<
cout<
cout<
}
输入
输出
样例输入
Li Sun # Zhao Zhou # # Wang # # Qian # #
样例输出
Li Sun Zhao Zhou Wang Qian Sun Zhou Zhao Wang Li Qian Zhou Wang Zhao Sun Qian Li
提示
来源
提交
import java.util.Scanner;class Node {public Object data;public Node next;public Node() {this(null,null);}public Node(Object data) {this(data,null);}public Node(Object data, Node next) {this.data = data;this.next = next;}}class LinkStack{private Node top; // 栈顶元素的引用// 将一个已经存在的栈置成空public void clear() {top = null;}// 测试栈是否为空public boolean isEmpty() {return top == null;}// 求栈中的数据元素个数并由函数返回其值public int length() {Node p = top;// 初始化,p指向栈顶结点,length为计数器int length = 0;while (p != null) {// 从栈顶结点向后查找,直到p指向栈顶结点p = p.next;// 指向后继结点++length;// 长度增1}return length;}// 查看栈顶对象而不移除它,返回栈顶对象public Object peek() {if (!isEmpty())return top.data;// 返回栈顶元素elsereturn null;}// 移除栈顶对象并作为此函数的值返回该对象public Object pop() {if (!isEmpty()) {Node p = top;// p指向栈顶结点top = top.next;return p.data;} elsereturn null;}// 把项压入栈顶public void push(Object x) {Node p = new Node(x); // 构造一个新的结点p.next=top;top = p;// 改变栈顶结点}// 打印函数,打印所有栈中的元素(栈顶到栈底)public void display() {Node p = top; // p指向栈顶结点,q指向p的下一结点while (p != null) {// 打印所有非空的结点System.out.print((p.data.toString() + " ")); // 打印p = p.next;// 指向p下一元素}}}class LinkQueue{private Node front;private Node rear;public LinkQueue() {front = rear = null;}public void clear() {front = rear = null;}public boolean isEmpty() {return front == null;}public int length() {Node p = front;int length = 0;while (p != null) {p = p.next;++length;}return length;}public void offer(Object o) {Node p = new Node(o);if (front != null) {rear.next=p;rear = p;} elsefront = rear = p;}public Object peek() {if (front != null)return front.data;elsereturn null;}public Object poll() {if (front != null) {Node p = front;front = front.next;if (p==rear)rear=null;return p.data;} elsereturn null;}public void display() {if (!isEmpty()) {Node p = front;while (p != rear.next) {System.out.print(p.data.toString() + " ");p = p.next;}} else {System.out.println("此队列为空");}}}class BiTreeNode {public Object data;// 结点的数据元素public BiTreeNode lchild, rchild; // 左右孩子public BiTreeNode() {// 构造一个空结点this(null);}public BiTreeNode(Object data) {// 构造一棵左右孩子为空的结点this(data, null, null);}public BiTreeNode(Object data, BiTreeNode lchild, BiTreeNode rchild) {// 构造一棵数据元素和左右孩子都不为空的结点this.data = data;this.lchild = lchild;this.rchild = rchild;}}class BiTree {private BiTreeNode root;// 树的根结点public BiTree() {// 构造一棵空树this.root = null;}public BiTree(BiTreeNode root) {// 构造一棵树this.root = root;}// 由先根遍历的数组和中根遍历的数组建立一棵二叉树// 其中参数preOrder是整棵树的 先根遍历,inOrder是整棵树的中根遍历,preIndex是// 先根遍历从preOrder字符串中的开始位置,inIndex是中根遍历从字符串inOrder中的开始位置,count表示树结点的个数public BiTree(String preOrder, String inOrder, int preIndex, int inIndex,int count) {if (count > 0) {// 先根和中根非空char r = preOrder.charAt(preIndex);// 取先根字符串中的第一个元素作为根结点int i = 0;for (; i < count; i++)// 寻找根结点在中根遍历字符串中的索引if (r == inOrder.charAt(i + inIndex))break;root = new BiTreeNode(r);// 建立树的根结点root.lchild=new BiTree(preOrder, inOrder, preIndex + 1, inIndex,i).root;// 建立树的左子树root.rchild=new BiTree(preOrder, inOrder, preIndex + i + 1,inIndex + i + 1, count - i - 1).root;// 建立树的右子树}}// 由标明空子树的先根遍历序列建立一棵二叉树private static int index = 0;// 用于记录preStr的索引值public BiTree(String[] preStr) {String c = preStr[index++];// 取出字符串索引为index的字符,且index增1if (!c.equals("#") ) {// 字符不为#root = new BiTreeNode(c);// 建立树的根结点root.lchild=new BiTree(preStr).root;// 建立树的左子树root.rchild=new BiTree(preStr).root;// 建立树的右子树} elseroot = null;}// 先根遍历二叉树基本操作的递归算法public void preRootTraverse(BiTreeNode T) {if (T != null) {System.out.print(T.data); // 访问根结点preRootTraverse(T.lchild);// 访问左子树preRootTraverse(T.rchild);// 访问右子树}}// 先根遍历二叉树基本操作的非递归算法public void preRootTraverse() {BiTreeNode T = root;if (T != null) {LinkStack S = new LinkStack();// 构造栈S.push(T);// 根结点入栈while (!S.isEmpty()) {T = (BiTreeNode) S.pop();// 移除栈顶结点,并返回其值System.out.print(T.data +" "); // 访问结点while (T != null) {if (T.lchild != null) // 访问左孩子System.out.print(T.lchild.data +" "); // 访问结点if (T.rchild != null)// 右孩子非空入栈S.push(T.rchild);T = T.lchild;}}}}// 中根遍历二叉树基本操作的递归算法public void inRootTraverse(BiTreeNode T) {if (T != null) {inRootTraverse(T.lchild);// 访问左子树System.out.print(T.data); // 访问根结点inRootTraverse(T.rchild);// 访问右子树}}// 中根遍历二叉树基本操作的非递归算法public void inRootTraverse() {BiTreeNode T = root;if (T != null) {LinkStack S = new LinkStack();// 构造链栈S.push(T); // 根结点入栈while (!S.isEmpty()) {while (S.peek() != null)// 将栈顶结点的所有左孩子结点入栈S.push(((BiTreeNode) S.peek()).lchild);S.pop(); // 空结点退栈if (!S.isEmpty()) {T = (BiTreeNode) S.pop();// 移除栈顶结点,并返回其值System.out.print(T.data +" "); // 访问结点S.push(T.rchild);// 结点的右孩子入栈}}}}// 后根遍历二叉树基本操作的递归算法public void postRootTraverse(BiTreeNode T) {if (T != null) {postRootTraverse(T.lchild);// 访问左子树postRootTraverse(T.rchild);// 访问右子树System.out.print(T.data); // 访问根结点}}// 后根遍历二叉树基本操作的非递归算法public void postRootTraverse() {BiTreeNode T = root;if (T != null) {LinkStack S = new LinkStack();// 构造链栈S.push(T); // 根结点进栈Boolean flag;// 访问标记BiTreeNode p = null;// p指向刚被访问的结点while (!S.isEmpty()) {while (S.peek() != null)// 将栈顶结点的所有左孩子结点入栈S.push(((BiTreeNode) S.peek()).lchild);S.pop(); // 空结点退栈while (!S.isEmpty()) {T = (BiTreeNode) S.peek();// 查看栈顶元素if (T.rchild == null || T.rchild == p) {System.out.print(T.data +" "); // 访问结点S.pop();// 移除栈顶元素p = T;// p指向刚被访问的结点flag = true;// 设置访问标记} else {S.push(T.rchild);// 右孩子结点入栈flag = false;// 设置未被访问标记}if (!flag)break;}}}}// 层次遍历二叉树基本操作的算法(自左向右)public void levelTraverse() {BiTreeNode T = root;if (T != null) {LinkQueue L = new LinkQueue();// 构造队列L.offer(T);// 根结点入队列while (!L.isEmpty()) {T = (BiTreeNode) L.poll();System.out.print(T.data); // 访问结点if (T.lchild != null)// 左孩子非空,入队列L.offer(T.lchild);if (T.rchild != null)// 右孩子非空,入队列L.offer(T.rchild);}}}public BiTreeNode getRoot() {return root;}public void setRoot(BiTreeNode root) {this.root = root;}// 统计叶结点数目public int countLeafNode(BiTreeNode T) {int count = 0;if (T != null) {if (T.lchild == null && T.rchild == null) {++count;// 叶结点个数加1} else {count += countLeafNode(T.lchild); // 加上左子树上叶结点的个数count += countLeafNode(T.rchild);// 加上右子树上叶结点的个数}}return count;}// 统计结点的数目public int countNode(BiTreeNode T) {int count = 0;if (T != null) {++count;// 结点的个数加1count += countNode(T.lchild); // 加上左子树上结点的个数count += countNode(T.rchild);// 加上右子树上结点的个数}return count;}}public class Main {public static void main(String[] args) {// TODO Auto-generated method stubScanner scanner = new Scanner(System.in);String s = scanner.nextLine();String[] ss = s.split(" ");BiTree b = new BiTree(ss);b.preRootTraverse();System.out.println();b.inRootTraverse();System.out.println();b.postRootTraverse();}}
