数据结构-二叉链表存储的二叉树(利用先序遍历)

树形结构是一类重要的非线性数据结构,其中以树和二叉树最为常用。对于每一个结点至多只有两课子树的一类树,称其为二叉树。二叉树的链式存储结构是一类重要的数据结构,其形式定义如下:

而二叉树的前序、中序遍历是非常重要的能够访问二叉树所有结点的算法,下面分别列出一种先序遍历和两种中序遍历的算法。

第一种中序遍历的方法(算法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);
		}
	}
}

 原题链接:数据结构-二叉链表存储的二叉树 - C语言网 (dotcpp.com)

  • 11
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值