1.二叉树的先根,中根,后根遍历
public class BinaryTree<T> {
public BinaryNode<T> root;
public BinaryTree(){
this.root=null;
}
public BinaryNode<T> insert(T x){
return this.root=new BinaryNode<T>(x,this.root,null);
}
public BinaryNode<T> insert(BinaryNode<T> parent,T x,boolean leftChild){
if(x==null)
return null;
if(leftChild)
return parent.left=new BinaryNode<T>(x,parent.left,null);
return parent.right=new BinaryNode<T>(x,null,parent.right);
}
public void remove(BinaryNode<T> parent,boolean leftChild){
if(leftChild)
parent.left=null;
else parent.right=null;
}
public void clear(){
this.root=null;
}
public void preorder(){
preorder(this.root);
System.out.println();
}
private void preorder(BinaryNode<T> p){
if(p!=null){
System.out.print(p.data.toString()+" ");
preorder(p.left);
preorder(p.right);
}
}
public String toString(){
return toString(this.root);
}
private String toString(BinaryNode<T> p){
if(p==null)
return "^";
return p.data.toString()+" "+toString(p.left)+toString(p.right);
}
public void inorder(){
inorder(this.root);
System.out.println();
}
private void inorder(BinaryNode<T> p){
if(p!=null){
inorder(p.left);
System.out.print(p.data.toString()+" ");
inorder(p.right);
}
}
public void postorder(){
postorder(this.root);
System.out.println();
}
private void postorder(BinaryNode<T> p){
if(p!=null){
postorder(p.left);
postorder(p.right);
System.out.print(p.data.toString()+" ");
}
}
public BinaryTree(T[] prelist){
this.root=create(prelist);
}
private int i=0;
private BinaryNode<T> create(T[] prelist){
BinaryNode<T> p=null;
if(i<prelist.length){
T elem=prelist[i];
i++;
if(elem!=null){
p=new BinaryNode<T>(elem);
p.left=create(prelist);
p.right=create(prelist);
}
}
return p;
}
public static void main(String[] args){
Integer[] prelist={1,2,3,4,5,6,7,8,9,10};
BinaryTree<Integer> bitree=new BinaryTree<Integer>(prelist);
System.out.println("先根次序遍历二叉树:"+bitree.toString());
System.out.print("中根次序遍历二叉树:"); bitree.inorder();
System.out.print("后根次序遍历二叉树:"); bitree.postorder();
}
}
class BinaryNode<T>{
public T data;
public BinaryNode<T> left,right;
public BinaryNode(T data,BinaryNode<T> left,BinaryNode<T> right){
this.data=data;
this.left=left;
this.right=right;
}
public BinaryNode(T data){//构造元素为data的叶子结点
this(data, null, null);
}
public String toString(){
return this.data.toString();
}
public boolean isLeaf(){
return this.left==null&&this.right==null;
}
}

2.求一棵BinaryTree<Integer>二叉树中各结点数值的平均值
public class BinaryTree<T> {
public BinaryNode<T> root;
public BinaryTree(){
this.root=null;
}
public void preorder(){
preorder(this.root);
System.out.println();
}
private void preorder(BinaryNode<T> p){
if(p!=null){
System.out.print(p.data.toString()+" ");
preorder(p.left);
preorder(p.right);
}
}
public String toString(){
return toString(this.root);
}
private String toString(BinaryNode<T> p){
if(p==null)
return "^";
return p.data.toString()+" "+toString(p.left)+toString(p.right);
}
private double sum=0;
private double n=0;
public void average(){
count(this.root);
double res=sum/n;
System.out.println("各结点数值的平均值为:"+res);
}
public void count(BinaryNode<T> p){
if(p!=null){
n++;
count(p.left);
count(p.right);
sum+=(int) p.data;
}
}
public BinaryTree(T[] prelist){
this.root=create(prelist);
}
private int i=0;
private BinaryNode<T> create(T[] prelist){
BinaryNode<T> p=null;
if(i<prelist.length){
T elem=prelist[i];
i++;
if(elem!=null){
p=new BinaryNode<T>(elem);
p.left=create(prelist);
p.right=create(prelist);
}
}
return p;
}
public static void main(String[] args){
Integer[] prelist={1,2,3,null,4,null,null,null,5,6,null,null,7,8};
BinaryTree<Integer> bitree=new BinaryTree<Integer>(prelist);
System.out.println("先根次序遍历二叉树:"+bitree.toString());
bitree.average();
}
}
class BinaryNode<T>{
public T data;
public BinaryNode<T> left,right;
public BinaryNode(T data,BinaryNode<T> left,BinaryNode<T> right){
this.data=data;
this.left=left;
this.right=right;
}
public BinaryNode(T data){//构造元素为data的叶子结点
this(data, null, null);
}
public String toString(){
return this.data.toString();
}
public boolean isLeaf(){
return this.left==null&&this.right==null;
}
}

3.由中根和后根次序遍历序列构造二叉树。
public class BinaryTree<T> {
public BinaryNode<T> root;
public BinaryTree() {
this.root = null;
}
public void preorder() {
preorder(this.root);
System.out.println();
}
private void preorder(BinaryNode<T> p) {
if (p != null) {
System.out.print(p.data.toString() + " ");
preorder(p.left);
preorder(p.right);
}
}
public String toString() {
return toString(this.root);
}
private String toString(BinaryNode<T> p) {
if (p == null)
return "^";
return p.data.toString() + " " + toString(p.left) + toString(p.right);
}
public BinaryTree(T[] inlist, T[] postlist) {
this.root = create(inlist, postlist, postlist.length - 1, 0, inlist.length);
}
private BinaryNode<T> create(T[] inlist, T[] postlist, int poststart, int instart, int n) {
if (n <= 0)
return null;
T elem = postlist[poststart];
BinaryNode<T> p = new BinaryNode<T>(elem);
int i = 0;
while (i < n && !elem.equals(inlist[instart + i])) {
i++;
}
p.left = create(inlist, postlist, poststart - n+i, instart, i);
p.right = create(inlist, postlist, poststart - 1, instart + i + 1, n - i - 1);
return p;
}
public static void main(String[] args) {
String[] inlist = { "D", "G", "B", "A", "E", "C", "H", "F" };
String[] postlist = { "G", "D", "B", "E", "H", "F", "C", "A" };
BinaryTree<String> bitree = new BinaryTree<String>(inlist, postlist);
System.out.println("先根次序遍历二叉树:" + bitree.toString());
}
}
class BinaryNode<T> {
public T data;
public BinaryNode<T> left, right;
public BinaryNode(T data, BinaryNode<T> left, BinaryNode<T> right) {
this.data = data;
this.left = left;
this.right = right;
}
public BinaryNode(T data) {// 构造元素为data的叶子结点
this(data, null, null);
}
public String toString() {
return this.data.toString();
}
/*public boolean isLeaf() {
return this.left == null && this.right == null;
}*/
}

本文详细介绍了二叉树的先根、中根、后根遍历算法,并提供了求二叉树节点平均值的方法及根据中根和后根序列构建二叉树的过程。通过实例演示了各种遍历方式及树的构建。
777

被折叠的 条评论
为什么被折叠?



