`
ch_kexin
  • 浏览: 898084 次
  • 性别: Icon_minigender_2
  • 来自: 青岛
社区版块
存档分类
最新评论

二叉树

J# 
阅读更多
引用

【一】
写一个程序给出两个集合A,B的大小m,n(0<=m,n<=100),以及集合内的元素(均为整数),求集合A-B{x|x属于A且x不属于B}并输出结果(顺序任意)

例如:输入
53
43215
623
输出 4  15


package com.ch.test;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Test1 {
	
	
	public void  getResult(){

		   List<Integer>  lista= new ArrayList();
		   List<Integer>  listb=new ArrayList();
		   List<Integer>  listc=new ArrayList();
		   List<Integer>  listd=new ArrayList();
		 
		
		Scanner inputA = new Scanner( System.in );
		Scanner inputB = new Scanner( System.in );

	    System.out.println("请输入第一个集合个数:");
	    int a= inputA.nextInt();
	    System.out.println("请输入第一个集合"+a+"个元素:");
	    for (int i = 0; i < a; i++)
	    {
	        lista.add(inputA.nextInt());
	    }
	    
	    System.out.println("请输入第二个集合个数:");
	    int b= inputB.nextInt();
	    System.out.println("请输入第二个集合"+b+"个元素:");
	    for (int i = 0; i < b; i++)
	    {      
	        listb.add(inputB.nextInt());
	    }
	    
	    for(int i=0; i<lista.size();i++){
	    	
	    	for(int j=0; j<listb.size();j++){
	    		
	    		if(lista.get(i)==listb.get(j))
	    		{
	    			listc.add(lista.get(i));
	    		}
	    	}
	    }
	    for (int i = 0; i < lista.size(); i++)
	    {   int info =0;
	    	for(int j=0;j<listc.size();j++){
	    		if(lista.get(i)==listc.get(j)){
	    		    info=1;
	    		}
	    	  }
	    	  if(info==1){
	    		  System.out.println("");
	          }else{
	        	  listd.add(lista.get(i));
	          }
	    } 
      
	    System.out.println("输出结果为:");
	   for (int i = 0; i < listd.size(); i++)
	    {      
	    	System.out.println( listd.get(i));
	    }
	}
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Test1 t =new Test1();
		t.getResult();
	}

}


引用

【二】
给一个二叉树(结点一“A-Z或a-z表示”,切无重复字母)的节点大小,以及先根遍历序列和中根遍历序列,输出他的后根遍历数列
例如:
输入7
  ABCDEFG
  CBEDAFG
输出
    CEDBGFA

从例题分析得:
根据先根遍历序列,我们可知道A为主根
根据中根遍历序列,我们可知道CBED在A根的左边,FG在A根的右边
以此递归,
根据先根遍历序列,我们可知道B为次根,且居左;
F为A的次根,且居右,G为F的次根
我们再以B根为主根分析,
根据中根遍历序列,我们可知道C在B根的左边,ED在B根的右边
再根据先根遍历序列,我们可知道,D为B根的次根,E为D的次根
这样我们就可得到
       A
     /   \
    B     F
   / \      \
  C   D      G
       \
        E

由此可推断出后根序列。

  • C语言方法

//方法一

#define EL 10 
#define TEL 2*EL+1 
#define LEN sizeof(struct node) 
#include "stdio.h" 
#include "stdlib.h" 

char pre[TEL]="ABCDEFGHIJ"; 
char pin[TEL]="CBEDAGHFJI"; 

typedef struct node 
{ char data; 
struct node * lch,*rch; 
}BTNode,*BTree; 
BTNode root; 
BTree rt=&root; 

int pos(char c,char s[],int st) 
{char *p; 
p=s+st; 
while(*p!=c && *p!='\0') p++; 
return p-s; 
} 

void create(BTree *t,int i1,int i2,int len) 
{int r,llen,rlen; 
if(len<=0) *t=NULL; 
else 
{*t=(BTree)malloc(LEN); 
(*t)->data=pre[i1]; 
r=pos(pre[i1],pin,i2); 
llen=r-i2; 
rlen=len-(llen+1); 
create(&(*t)->lch,i1+1,i2,llen); 
create(&(*t)->rch,i1+llen+1,r+1,rlen); 
} 
} 

void travel(BTree t) 
{if(t) 
{travel(t->lch); 
travel(t->rch); 
putchar(t->data); 
} 
} 

int main() 
{create(&rt,0,0,EL); 
if(rt) travel(rt); 
} 
//方法二
#i nclude<stdio.h>
#i nclude<malloc.h>
#i nclude<string.h>
typedef struct node
{
  char ch;
  struct node *left,*right;
}node;                   // 定义节点的结构 
node * creat(char *pre,char *in,int len);
void print(node *head);
int main()
{
  int i,j,k,m,n,len;
  char pre[30],in[30];    // 存储先序和中序遍历的序列 
  node *head;
  head=(node*)malloc(sizeof(node));
  while(scanf("%s%s",pre,in)!=EOF)
  { len=strlen(pre);
    head=creat(pre,in,len);
    print(head);
    printf("\n");
  }
  return 0;
}
node * creat(char *pre,char *in,int len)  // 创建后序遍历的函数 
{  int k;
   if(len<=0) return NULL;
   node *head=(node*)malloc(sizeof(node));
   head->ch=*pre;
   char *p;
   for(p=in;p!=NULL;p++) 
      if(*p==*pre) break;                 // 在中序遍历的序列中得到与先序相同的节点 
   k=p-in;
   head->left=creat(pre+1,in,k);          //递归调用得到左子树 
   head->right=creat(pre+k+1,p+1,len-k-1);//得到右子树 
   return head;
}
void print(node *head)  // 打印后序遍历序列 
{
  if(head==NULL) return ;
  print(head->left);
  print(head->right);
  printf("%c",head->ch);
}


public class BinaryNode {
 Object element;
 BinaryNode left;
 BinaryNode right;

}


import java.util.*;

public class Queue {

 protected LinkedList list;

 // Postcondition: this Queue object has been initialized.
 public Queue() {

  list = new LinkedList();

 } // default constructor

 // Postcondition: the number of elements in this Queue object has been
 // returned.
 public int size() {

  return list.size();

 } // method size

 // Postcondition: true has been returned if this Queue object has no
 // elements. Otherwise, false has been returned.
 public boolean isEmpty() {

  return list.isEmpty();

 } // method isEmpty

 // Postconditon: A copy of element has been inserted at the back of this
 // Queue object. The averageTime (n) is constant and
 // worstTime (n) is O (n).
 public void enqueue(Object element) {

  list.addLast(element);

 } // method enqueue

 // Precondition: this Queue object is not empty. Otherwise,
 // NoSuchElementException will be thrown.
 // Postcondition: The element that was at the front of this Queue object -
 // just before this method was called -- has been removed
 // from this Queue object and returned.
 public Object dequeue() {

  return list.removeFirst();

 } // method dequeue

 // Precondition: this Queue object is not empty. Otherwise,
 // NoSuchElementException will be thrown.
 // Postcondition: the element at index 0 in this Queue object has been
 // returned.
 public Object front() {

  return list.getFirst();

 } // method front

} // Queue class


import java.io.IOException;


public class BinaryTree {
 BinaryNode root;
 
 
 public BinaryTree() {
  super();
  // TODO 自动生成构造函数存根
  root=this.createPre();
 }

 public BinaryNode createPre()
 //按照先序遍历的输入方法,建立二叉树
 {
  BinaryNode t=null;
  char ch;
  try {
   ch = (char)System.in.read();
  
  if(ch==' ')
   t=null;
  else 
  {
   t=new BinaryNode();
   t.element=(Object)ch;
   t.left=createPre();
   t.right=createPre();
  }
  } catch (IOException e) {
   // TODO 自动生成 catch 块
   e.printStackTrace();
  }
  return t;
 }
 
 public void inOrder()
 {
  this.inOrder(root);
 }
 
 public void inOrder(BinaryNode t)
 //中序遍历二叉树
 {
  if(t!=null)
  {
   inOrder(t.left);
   System.out.print(t.element);
   inOrder(t.right);
  }
 }
 
 public void postOrder()
 {
  this.postOrder(root);
 }
 
 public void postOrder(BinaryNode t)
 //后序遍历二叉树
 {
  if(t!=null)
  {
   postOrder(t.left);
   System.out.print(t.element);
   postOrder(t.right);
  }
 }
 
 public void preOrder()
 {
  this.preOrder(root);
 }
 public void preOrder(BinaryNode t)
 //前序遍历二叉树
 {
  if(t!=null)
  {
   System.out.print(t.element);
   preOrder(t.left);
   preOrder(t.right);
  }
 }
 
 public void breadthFirst()
 {
  Queue treeQueue=new Queue();
  BinaryNode p;
  if(root!=null)
   treeQueue.enqueue(root);
  while(!treeQueue.isEmpty())
  {
   System.out.print(((BinaryNode)(treeQueue.front())).element);
   p=(BinaryNode)treeQueue.dequeue();
   if(p.left!=null)
   treeQueue.enqueue(p.left);
   if(p.right!=null)
   treeQueue.enqueue(p.right);
  }
 }
}


public class BinaryTreeTest {

 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO 自动生成方法存根
  BinaryTree tree = new BinaryTree();
  
  System.out.println("先序遍历:");
  tree.preOrder();
  System.out.println();

  System.out.println("中序遍历:"); 
  tree.inOrder();
  System.out.println();

  System.out.println("后序遍历:");
  tree.postOrder();
  System.out.println();
  
  System.out.println("层次遍历:");
  tree.breadthFirst();
  System.out.println();
 }

} 

分享到:
评论

相关推荐

    二叉树深度_二叉树查询_二叉树深度_

    二叉树是一种在计算机科学中广泛应用的数据结构,它由节点(也称为结点)组成,每个节点最多有两个子节点,通常称为左子节点和右子节点。二叉树的深度是指从根节点到最远叶节点的最长路径上边的数目,即树的最大层数...

    二叉树演示 实现二叉树图形显示

    二叉树是一种特殊的树结构,每个节点最多只有两个子节点,通常分为左子节点和右子节点。在计算机科学中,二叉树被广泛应用于数据的组织和操作,如搜索、排序、文件系统等。本例子关注的是如何实现二叉树的图形显示,...

    根据后序二叉树序列构造二叉树_扩展二叉树

    在计算机科学领域,二叉树是一种基础的数据结构,它由结点构成,每个结点最多有两个子节点,分别称为左子节点和右子节点。在众多的二叉树操作中,根据后序遍历序列(也称为后序序列)来构造二叉树是一项常见的任务。...

    二叉树建立 二叉树基本算法的实现

    (2)先序、中序、后序遍历二叉树:递归算法。 (3)中序遍历二叉树:非递归算法(最好也能实现先序,后序非递归算法)。 (4)求二叉树的高度 。 (5)求二叉树的叶子个数。 (6)对于树中每一个元素值为x的结点...

    第六章 树和二叉树作业及答案(100分).docx

    - **答案解析**:如果一棵二叉树的中序遍历序列和后序遍历序列正好相反,那么该二叉树一定是任一结点都没有左孩子的二叉树。 #### 5. 二叉树的结点数范围 - **答案解析**:深度为k的二叉树最多有\(2^k - 1\)个结点...

    将满二叉树转化为求和二叉树_二叉树_

    在IT领域,特别是数据结构和算法的学习中,二叉树是一种重要的抽象数据类型。满二叉树是一种特殊的二叉树,其中每一层都是完全填充的,除了可能的最后一层,且最后一层的所有节点都尽可能地向左靠拢。而将满二叉树...

    二叉树的各种操作各种遍历,复制,求高度,判断是否为一棵完全二叉树以及计算用二叉树存储的表达式

    根据给定的信息,本文将详细介绍二叉树的基本概念及其在程序中的实现方法,包括二叉树的创建、遍历(前序、中序、后序)、复制、求高度、判断是否为完全二叉树以及利用二叉树进行表达式的计算等操作。 ### 一、...

    构造二叉树与遍历二叉树

    ### 构造二叉树与遍历二叉树 #### 一、二叉树的基本概念 二叉树(Binary Tree)是一种非线性数据结构,在计算机科学中被广泛应用于各种算法和程序设计中。一个二叉树由零个或多个节点组成,其中每个节点最多有两个子...

    按凹入表形式横向打印任意二叉树结构,即二叉树的根在屏幕的最左边,二叉树的左子树在屏幕的下边,二叉树的右子树在屏幕的上边。

    二叉树横向打印算法的实现 二叉树是一种基本的数据结构,在计算机科学和编程中广泛应用。本资源介绍了一种特殊的二叉树打印算法,即横向打印二叉树结构。该算法将二叉树的根节点放在屏幕的最左边,左子树在屏幕的...

    复制一棵二叉树

    ### 知识点:复制一棵二叉树 #### 一、引言 在计算机科学领域,数据结构中的二叉树是一种常见的非线性数据结构,它由节点组成,每个节点最多有两个子节点,分别称为左子节点和右子节点。复制二叉树是指创建一个与原...

    二叉树的基本运算

    建立一棵二叉树,试编程实现二叉树的如下基本操作: 1. 按先序序列构造一棵二叉链表表示的二叉树T; 2. 对这棵二叉树进行遍历:先序、中序、后序以及层次遍历,分别输出结点的遍历序列; 3. 求二叉树的深度/结点数目...

    二叉树相关算法的实验验证+判别给定二叉树是否为完全二叉树。

    1、 定义链接存储的二叉树类。 2、 实验验证如下算法的正确性、各种功能及指标: 1) 创建一棵二叉树,并对其初始化; 2)先根、中根、后根遍历二叉树; 3) 在二叉树中搜索给定结点的父结点; 4) 搜索二叉树中符合...

    二叉树的建立与遍历

    二叉树的建立与遍历 二叉树是一种重要的数据结构,它广泛应用于计算机科学和软件工程中。在这篇文章中,我们将讨论二叉树的建立和遍历,包括先序遍历、中序遍历和后序遍历。 一、数据结构的重要性 数据结构是...

    二叉树_二叉树遍历_

    1.二叉树的基本操作实现【问题描述】建立一棵二叉树,用递归方法实现二叉树的如下基本操作:(1)按先序序列构造一棵二叉链表表示的二叉树T;(2)对这棵二叉树进行遍历:先序、中序、后序以及层次遍历,分别输出...

    二叉树树形输出

    ### 二叉树树形输出知识点解析 #### 一、二叉树基本概念 二叉树是一种树形数据结构,其中每个节点最多有两个子节点,分别称为左子节点和右子节点。在计算机科学中,二叉树经常被用于实现各种算法和数据结构,如搜索...

    二叉树模拟器.py二叉树模拟器.py

    二叉树模拟器.py二叉树模拟器.py二叉树模拟器.py二叉树模拟器.py二叉树模拟器.py二叉树模拟器.py二叉树模拟器.py二叉树模拟器.py二叉树模拟器.py二叉树模拟器.py二叉树模拟器.py二叉树模拟器.py二叉树模拟器.py...

    设计程序实现二叉树结点的类型定义和对二叉树的基本操作

    ### 二叉树基本操作知识点解析 #### 一、实验目的 在本实验中,学习者将通过实际编程练习来加深对二叉树这一数据结构的理解,并熟练掌握其基本操作。具体目标包括: 1. **熟悉二叉树结点的结构和对二叉树的基本...

    二叉树遍历实验报告

    ### 二叉树遍历实验报告知识点概览 #### 一、实验背景及目标 **实验背景:** 本次实验属于《数据结构》课程的一部分,旨在通过实际编程加深学生对二叉树这一数据结构的理解和应用能力。二叉树作为一种基本且重要的...

Global site tag (gtag.js) - Google Analytics