树形结构是一类重要的非线性数据结构,其中以树和二叉树最为常用。对于每一个结点至多只有两课子树的一类树,称其为二叉树。二叉树的链式存储结构是一类重要的数据结构,其形式定义如下:
而二叉树的前序、中序遍历是非常重要的能够访问二叉树所有结点的算法,下面分别列出一种先序遍历和两种中序遍历的算法。
第一种中序遍历的方法(算法6.3):
第二种中序遍历的方法(算法6.2):
通过读入一个字符串,建立二叉树的算法如下:
在本题中,将会给出一个按照先序遍历得出的字符串,空格代表空的子节点,大写字母代表节点内容。请通过这个字符串建立二叉树,并按照题目描述中的一种先序遍历和两种中序遍历的算法分别输出每一个非空节点。
输入格式
输入只有一行,包含一个字符串S,用来建立二叉树。保证S为合法的二叉树先序遍历字符串,节点内容只有大写字母,且S的长度不超过100。
输出格式
共有三行,每一行包含一串字符,表示分别按先序、中序、中序得出的节点内容,每个字母后输出一个空格。请注意行尾输出换行。
样例输入
ABC DE G F
样例输出
A B C D E G F C B E G D F A C B E G D F A
c++代码如下 :
#include<iostream>
#include<algorithm>
using namespace std;
typedef struct TNode* Tree;
string preOrder;
int i;
struct TNode
{
char data;
Tree l_child,r_child;
};
Tree create()
{
Tree T = new TNode;
if(preOrder[i] == ' '||i>=preOrder.size()) //结点为空格或超出范围为空
{
i++;
T = NULL;
return T;
}
T->data = preOrder[i++];
T->l_child = create();//分别创建左右结点
T->r_child = create();
return T;
}
void PreOrderTraverse(Tree T)//先序遍历输出
{
if(T!=NULL)
{
cout<<T->data<<' ';
PreOrderTraverse(T->l_child);
PreOrderTraverse(T->r_child);
}
}
void InOrderTraverse(Tree T)//中序遍历输出
{
if(T!=NULL)
{
InOrderTraverse(T->l_child);
cout<<T->data<<' ';
InOrderTraverse(T->r_child);
}
}
int main()
{
getline(cin,preOrder);//按题目格式输入先序遍历
Tree T = NULL;
T = create();//创建二叉树
PreOrderTraverse(T);
cout<<endl;
InOrderTraverse(T);
cout<<endl;
InOrderTraverse(T);
return 0;
}
Java代码如下:
import java.util.*;
public class Main {
public static void main(String[]args) {
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
LinkTree tt = new LinkTree(str);//实例化
tt.create();//生成树
tt.PreOrderTraverse(tt.root);
System.out.println();
tt.InOrderTraverse(tt.root);
System.out.println();
tt.InOrderTraverse(tt.root);
}
}
class TreeNode{//树结点
public char data;
public TreeNode lchild;
public TreeNode rchild;
}
class LinkTree{
public TreeNode root;//根
private String str;//先序遍历的字符串
private int idx;//上面字符串的下标
public LinkTree(String str) {
root = null;
this.str = str;
idx = 0;
}
//创建二叉树
public void create() {
root = insideCreate();
}
private TreeNode insideCreate(){
TreeNode T = new TreeNode();
if(str.charAt(idx)==' '||idx>=str.length()) {
idx++;
T = null;
return T;
}
T.data = str.charAt(idx);
idx++;
T.lchild = insideCreate();
T.rchild = insideCreate();
return T;
}
//输出先序遍历
public void PreOrderTraverse(TreeNode T) {
if(T!=null) {
System.out.print(T.data+" ");
PreOrderTraverse(T.lchild);
PreOrderTraverse(T.rchild);
}
}
//输出中序遍历
public void InOrderTraverse(TreeNode T) {
if(T!=null) {
InOrderTraverse(T.lchild);
System.out.print(T.data+" ");
InOrderTraverse(T.rchild);
}
}
}