Java二叉树构造问题 要求:从控制台输入一行扩展二叉树的字符串,然后根据这个字符串构造二叉树。THX..

建立一棵二叉树,数据以字符串形式从键盘输入。~

代码如下:
char a[105];
int len,i;//i逐渐增加
void build(int s){
if(i==len) return;//已经建完树了
char c=a[i];//当前的字符
i++;
if(!tree[s].l) tree[s].l=c;//如果树的左边是空的,就给左边赋值
else tree[s].r=c;//反之
if(c!=' ') build(c);
if(c!=' ') build(c);//再来递归两下
}

扩展资料
树的定义还需要强调以下两点:
1)n>0时根结点是唯一的,不可能存在多个根结点,数据结构中的树只能有一个根结点。
2)m>0时,子树的个数没有限制,但它们一定是互不相交的。
由树的定义可以看出,树的定义使用了递归的方式。递归在树的学习过程中起着重要作用。
结点拥有的子树数目称为结点的度。结点子树的根结点为该结点的孩子结点。相应该结点称为孩子结点的双亲结点。从根开始定义起,根为第一层,根的孩子为第二层,以此类推。树中结点的最大层次数称为树的深度或高度。二叉树是n(n>=0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树组成。由二叉树定义以及图示分析得出二叉树有以下特点:
1)每个结点最多有两颗子树,所以二叉树中不存在度大于2的结点
2)左子树和右子树是有顺序的,次序不能任意颠倒。
3)即使树中某结点只有一棵子树,也要区分它是左子树还是右子树。
参考资料来源:
百度百科——二叉树

int findMidMid(char mid[], int midBegin, int midEnd, char root)
{
for (int i = midBegin; i <= midEnd; i++)
if (root == mid[i])
return i;
}
int findFirstMid(char first[], int firstBegin, int firstEnd, char mid[], int midBegin, int midMid);
{
if (midBegin == midMid)
return firstBegin;
int curMidPos = firstBegin;
for (int i = midBegin; i < midMid; i++)
for (int j = firstBegin + 1; j <= firstEnd; j++)
{
if ((first[j] == mid[i]) && (j > curMidPos))
curMidPos = j;
}
return curMidPos;
}
//构建二叉树
TreeNode * BuildTree(char first[], int firstBegin, int firstEnd, char mid[], int midBegin, int midEnd)
{
TreeNode *root = new TreeNode();
root->value = first[firstBegin]; //前序的第一个元素即为根结点
//中序序列中找到根的位置,其左边为左子树,右边为右子树
int midMid = findMidMid(mid, midBegin, midEnd, first[firstBegin]);
//找到中序序列中左子树所有节点在前序序列中的最后位置,此时该位置的右边为右子树
int firstMid = findFirstMid(first, firstBegin, firstEnd, mid, midBegin, midMid);
if (midMid != midBegin) //如果树的根结点有左子树
root->left = BuildTree(first, firstBegin+ 1, firstMid , mid, midBegin, midMid - 1);
else
root->left = NULL;
if (midMid != midEnd) //如果树的根结点有右子树
root->right = BuildTree(first, firstMid + 1, firstEnd, mid, midMid + 1, midEnd);
else
root->right = NULL;
return root;
}
//遍历二叉树输出度1的结点
void findDegreeOne(TreeNode *root)
{
if (root == NULL)
return;
if ((root->left == NULL && root->right != NULL) ||
(root->left != NULL && root->right == NULL) )
printf("%c ", root->value);
findDegreeOne(root->left);
findDegreeOne(root->right);
}

测试类:
package tree;

import java.util.*;

public class Test {

public static void main(String[] args){
List<Tree> trees=new ArrayList<Tree>();
int id=1;
Tree tree1=new Tree(0,id++,"张三丰");
Tree tree2=new Tree(tree1.getId(),id++,"武当宋大侠宋远桥");
Tree tree3=new Tree(tree1.getId(),id++,"武当俞二侠俞莲舟");
Tree tree4=new Tree(tree1.getId(),id++,"武当俞三侠俞岱岩");
Tree tree5=new Tree(tree1.getId(),id++,"武当张四侠张松溪");
Tree tree6=new Tree(tree1.getId(),id++,"武当张五侠张翠山");
Tree tree7=new Tree(tree1.getId(),id++,"武当殷六侠殷梨亭");
Tree tree8=new Tree(tree1.getId(),id++,"武当莫七侠莫声谷");
Tree tree9=new Tree(tree6.getId(),id++,"明教张无忌");
Tree tree13=new Tree(tree2.getId(),id++,"叛徒宋青书");

Tree tree10=new Tree(0,id++,"任我行");
Tree tree11=new Tree(tree10.getId(),id++,"令狐冲");
Tree tree12=new Tree(tree10.getId(),id++,"任盈盈");

trees.add(tree1);
trees.add(tree2);
trees.add(tree3);
trees.add(tree4);
trees.add(tree5);
trees.add(tree6);
trees.add(tree7);
trees.add(tree8);
trees.add(tree9);
trees.add(tree10);
trees.add(tree11);
trees.add(tree12);
trees.add(tree13);

for(int i=0;i<trees.size();i++){
Tree tree=trees.get(i);
if(tree.getParentId()==0){
tree.showChildTree(trees);
}
}

}

}

树类:
package tree;

import java.util.List;

public class Tree {
private int parentId;
private int id;
private String showStr;
private String Spaces="";

public Tree() {
// TODO Auto-generated constructor stub
}
public Tree(int parentId,int id,String showStr){
this.parentId=parentId;
this.id=id;
this.showStr=showStr;
}

public void showChildTree(List<Tree> trees){
if(parentId!=0){
trees.get(id-1).setSpaces(trees.get(parentId-1).getSpaces()+" ");
}
System.out.println(trees.get(id-1).getSpaces()+showStr);
for(int i=0;i<trees.size();i++){
Tree tree=trees.get(i);
if(tree.getParentId()==id){
tree.showChildTree(trees);
}
}

}

public int getParentId() {
return parentId;
}

public void setParentId(int parentId) {
this.parentId = parentId;
}

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getShowStr() {
return showStr;
}

public void setShowStr(String showStr) {
this.showStr = showStr;
}

public String getSpaces() {
return Spaces;
}

public void setSpaces(String spaces) {
Spaces = spaces;
}

}

控制台效果图:
张三丰
武当宋大侠宋远桥
叛徒宋青书
武当俞二侠俞莲舟
武当俞三侠俞岱岩
武当张四侠张松溪
武当张五侠张翠山
明教张无忌
武当殷六侠殷梨亭
武当莫七侠莫声谷
任我行
令狐冲
任盈盈


日日财源顺意来 年年福禄随春到 横批:新春大吉

有啥问题啊?

怎么了,有什么错误吗

相关兴趣推荐

IT评价网,数码产品家用电器电子设备等点评来自于网友使用感受交流,不对其内容作任何保证

联系反馈
Copyright© IT评价网