首页 > 试题广场 >

树的不同形态

[编程题]树的不同形态
  • 热度指数:2956 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
给定二叉树T(树深度不超过H<=10,深度从1开始,节点个数N<1024,节点编号1~N)的层序和中序遍历,输出T从左向右叶子节点以及树先序和后序遍历序列

输入描述:
输入两行,分别代表层序和中序遍历结果,节点编号按单个空格分开


输出描述:
依次输出  从左向右叶子节点 ,先序, 后序 遍历 。 节点编号按空格分开
示例1

输入

3 5 4 2 6 7 1
2 5 3 6 4 7 1

输出

2 6 1
3 5 2 4 6 7 1
2 5 6 1 7 4 3

/**
*1.利用层次遍历和中序遍历还原数组,我采用的是递归的方式,同时在递归的过程中判断记录叶子节点
*2.先序遍历
*3.后序遍历
*说明:中序遍历的根节点左边是左子树,右边是右子树,在层次遍历中根节点是第一个,然后把左子树的层次遍历和右子树的此次遍历提取出来进行递归
*/

import java.util.*; public class Main {     public static StringBuffer sb1=new StringBuffer();     public static StringBuffer sb2=new StringBuffer();     public static StringBuffer sb3=new StringBuffer();     public static void main(String[] args){         Scanner scan=new Scanner(System.in);         String str1=scan.nextLine();         String str2=scan.nextLine();         String[] s1=str1.split(" ");         TreeNode root=xun(s1,str2);         preOrder(root);         postOrder(root);         System.out.println(sb1.toString().trim());         System.out.println(sb2.toString().trim());         System.out.println(sb3.toString().trim());     }     public static TreeNode xun(String[] a,String b){         if(b.length()==0) return null;         int index=0;         String[] s2=b.split(" ");         int len=s2.length;         TreeNode temp=new TreeNode(a[0]);         for(;index<len;index++){             if(a[0].equals(s2[index])) break;         }         ArrayList<String> list1=new ArrayList(Arrays.asList(a));         ArrayList<String> list2=new ArrayList(Arrays.asList(a));         for(int i=0;i<=index;i++)             list1.remove(s2[i]);         for(int i=index;i<len;i++)             list2.remove(s2[i]);         temp.left=xun(list2.toArray(new String[list1.size()]),b.substring(0,b.indexOf(s2[index])));         if(index==len-1)             temp.right=null;         else             temp.right=xun(list1.toArray(new String[list2.size()]),b.substring(b.indexOf(s2[index+1])));         if(temp.left==null&&temp.right==null) sb1.append(temp.val+" ");         return temp;     }     public static void preOrder(TreeNode root){         if(root!=null){             sb2.append(root.val+" ");             preOrder(root.left);             preOrder(root.right);         }     }     public static void postOrder(TreeNode root){         if(root!=null){             postOrder(root.left);             postOrder(root.right);             sb3.append(root.val+" ");         }     } } class TreeNode{     public String val;     public TreeNode left;     public TreeNode right;     public TreeNode(String val){         this.val=val;         this.left=null;         this.right=null;     } }

编辑于 2019-05-10 20:15:31 回复(6)
#include<iostream>
#include<vector>
#include<cstdio>
#include<string>
#include<cstring>
using namespace std;
struct TreeNode
{
    int val;
    TreeNode *left,*right;
    TreeNode(int v):val(v),left(nullptr),right(nullptr){}
};

TreeNode* createTree(vector<int>inorder,vector<int>seq,int begin,int end)
{
    if(seq.size()<=0) return nullptr;
    TreeNode *root=new TreeNode(seq[0]);
    vector<int>left;
    vector<int>right;
    int k;
    for(k=begin;k<=end;++k)
        if(inorder[k]==seq[0])
        break;
    bool isleft;
    for(int i=1;i<seq.size();++i)
    {
        isleft=false;
        for(int j=begin;j<k;++j)
        {
            if(seq[i]==inorder[j])
            {
                isleft=true;
                break;
            }
        }
        if(isleft)
            left.push_back(seq[i]);
        else right.push_back(seq[i]);
    }
    root->left=createTree(inorder,left,begin,k-1);
    root->right=createTree(inorder,right,k+1,end);
    return root;
}

void preorder(TreeNode *ptr,vector<int>&pre)
{
    if(ptr!=nullptr)
    {
        pre.push_back(ptr->val);
        preorder(ptr->left,pre);
        preorder(ptr->right,pre);
    }
}

void postorder(TreeNode *ptr,vector<int>&post)
{
    if(ptr!=nullptr)
    {
        postorder(ptr->left,post);
        postorder(ptr->right,post);
        post.push_back(ptr->val);
    }
}
void getleafNode(TreeNode *ptr,vector<int>&leaf)
{
    if(ptr==nullptr) return ;
    if(ptr!=nullptr&&ptr->left==nullptr&&ptr->right==nullptr)
        {
            leaf.push_back(ptr->val);
            return ;
        }
    getleafNode(ptr->left,leaf);
    getleafNode(ptr->right,leaf);
    return ;
}
int main()
{
    int n;
    char *str=new char[100];
    vector<int>inorder;
    vector<int>seq;
    cin.getline(str,100);
    char *temp;
    temp=strtok(str," ");
    while(temp)
    {
        sscanf(temp,"%d",&n);
        seq.push_back(n);
        temp=strtok(NULL," ");
    }
    cin.getline(str,100);
    temp=strtok(str," ");
    while(temp)
    {
        sscanf(temp,"%d",&n);
        inorder.push_back(n);
        temp=strtok(NULL," ");
    }
    TreeNode *root=createTree(inorder,seq,0,inorder.size()-1);
    vector<int>pre,post,leaf;
    preorder(root,pre);
    postorder(root,post);
    getleafNode(root,leaf);
    for(int i=0;i<leaf.size();++i)
        cout<<leaf[i]<<" ";
    cout<<endl;
    for(int i=0;i<pre.size();++i)
        cout<<pre[i]<<" ";
    cout<<endl;
    for(int i=0;i<post.size();++i)
        cout<<post[i]<<" ";
    cout<<endl;
    return 0;
}

发表于 2019-05-17 10:50:24 回复(0)
class TreeNode(object):
    def __init__(self, x):
        self.left = None
        self.right = None
        self.val = x
 
 
class Solution(object):
    def __init__(self):
        self.leaf = []
 
    def creatTree(self, bfsorder, inorder):
        """
        从中序遍历找出左右子树,然后再从序列层次遍历中找出左右子树序列,重建二叉树
        :param bfsorder:
        :param inorder:
        :return:
        """
        if len(bfsorder) < 1:
            return
        if len(bfsorder) == 1 and bfsorder[0] not in self.leaf:
            self.leaf.append(bfsorder[0])
            # print(self.leaf)
        root = TreeNode(bfsorder[0])
        root_index = inorder.index(root.val)  # 根节点在中序遍历的索引
        left_in = inorder[:root_index]  # 中序遍历的左子树
        right_in = inorder[root_index + 1:]  # 中序遍历的左子树
        left_bsf = [x for x in bfsorder if x in left_in]  # 层次遍历的左子树、
        right_bfs = [x for x in bfsorder if x in right_in]
        root.left = self.creatTree(left_bsf, left_in)
        root.right = self.creatTree(right_bfs, right_in)
        return root
 
    def preorder(self, root):
        if not root:
            return []
        return [root.val] + self.preorder(root.left) + self.preorder(root.right)
 
    def postorder(self, root):
        if not root:
            return []
        return self.postorder(root.left) + self.postorder(root.right) + [root.val]
 
s = Solution()
bfsorder = [int(x) for x in input().split()]
inorder = [int(x) for x in input().split()]
root = s.creatTree(bfsorder, inorder)
 
pre = s.preorder(root)
post = s.postorder(root)
print(' '.join(list(map(str,s.leaf))))
print(' '.join(list(map(str,pre))))
print(' '.join(list(map(str,post))))

发表于 2019-05-20 15:27:10 回复(1)
import java.util.*;

class TreeNode {
	public String val;
	public TreeNode left;
	public TreeNode right;

	public TreeNode(String val) {
		this.val = val;
		this.left = null;
		this.right = null;
	}
}

public class Main {
	public static StringBuilder sb1 = new StringBuilder();
	public static StringBuilder sb2 = new StringBuilder();
	public static StringBuilder sb3 = new StringBuilder();

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		String[] levelTranversal = scan.nextLine().split(" ");
		String[] inOrderTranversal = scan.nextLine().split(" ");
		scan.close();
		//
		TreeNode root = getBinaryTree(levelTranversal, inOrderTranversal);
		preOrder(root);
		lastOrder(root);
		//
		System.out.println(sb1.toString().trim());
		System.out.println(sb2.toString().trim());
		System.out.println(sb3.toString().trim());
	}

	public static TreeNode getBinaryTree(String[] levelTranversal, String[] inOrderTranversal) {
		if (inOrderTranversal.length == 0)
			return null;
        //
		int index = 0;
		int inOrderTranversalLength = inOrderTranversal.length;
		TreeNode temp = new TreeNode(levelTranversal[0]);
        // 1. 找到这一轮的根节点
		while (!levelTranversal[0].equals(inOrderTranversal[index])) {
			index++;
		}
		// 2. 两数组存放中序序列划分出来的左边和右边,其分别包含了原二叉树的左子树和右子树
		String[] inOrderTranversalLeft = new String[index];
		String[] inOrderTranversalRight = new String[inOrderTranversalLength - index - 1];
		// 复制填充数据
		System.arraycopy(inOrderTranversal, 0, inOrderTranversalLeft, 0, inOrderTranversalLeft.length);
		for (int i = 0; i < inOrderTranversalRight.length; i++) {
			inOrderTranversalRight[i] = inOrderTranversal[index + i + 1];
		}
		// 3. 存放原二叉树左子树的层级序列,即中序序列划分出来的左边对应的层级序列。右边同理。
        String[] levelTranversalLeft = new String[inOrderTranversalLeft.length]; 
        String[] levelTranversalRight = new String[inOrderTranversalRight.length];
        // 填充数据
        int leftIndex = 0, rightIndex = 0;
        for (int i = 1; i < levelTranversal.length; i++) {
            // 是左的放左,否则就是右的,放右
            if (contains(inOrderTranversalLeft, levelTranversal[i])) {
                levelTranversalLeft[leftIndex++] = levelTranversal[i];
            }else {
                levelTranversalRight[rightIndex++] = levelTranversal[i];
            }
        }
        // 4. 递归处理左节点和右节点
        temp.left = getBinaryTree(levelTranversalLeft, inOrderTranversalLeft);
        temp.right = getBinaryTree(levelTranversalRight, inOrderTranversalRight);
        // 5. 存放叶子节点
        if (temp.left == null && temp.right == null) {
			sb1.append(temp.val).append(" ");
		}
		return temp;
	}
	
	private static boolean contains(String[] arr, String key) {
        for (String element : arr) {
            if (element.equals(key)) return true;
        }
        return false;
    }

	public static void preOrder(TreeNode root) {
		if (root != null) {
			sb2.append(root.val).append(" ");
			preOrder(root.left);
			preOrder(root.right);
		}
	}

	public static void lastOrder(TreeNode root) {
		if (root != null) {
			lastOrder(root.left);
			lastOrder(root.right);
			sb3.append(root.val).append(" ");
		}
	}
}

发表于 2019-10-06 10:36:26 回复(2)
没有重建出来整棵树,但是也是通过递归来类似的遍历重建树的过程,并在过程中通过存入一个链表来维护。
import java.util.*;
import static java.util.Arrays.asList;
import static java.util.Arrays.copyOfRange;

public class Main{
    static List treefinal = new ArrayList();
    public static void main(String []args){
        Scanner in = new Scanner(System.in);
        String []str1 = in.nextLine().split(" ");
        String []str2 = in.nextLine().split(" ");
        List<String> pre = Main.findpre(str1,str2);
        List<String> back = Main.findback2(str1,str2);
        System.out.print(treefinal.get(0));
        for(int i = 1; i < treefinal.size(); i++){
            System.out.print(" ");
            System.out.print(treefinal.get(i));
        }
        System.out.println();
        System.out.print(pre.get(0));
        for(int i = 1; i < pre.size(); i++){
            System.out.print(" ");
            System.out.print(pre.get(i));

        }
        System.out.println();
        System.out.print(back.get(0));
        for(int i = 1; i < back.size(); i++){
            System.out.print(" ");
            System.out.print(back.get(i));

        }
    }
    
    public static List<String> findpre(String[] str1, String[] str2){
        if(str1.length==0){
            return new ArrayList<String>();
        }
        List<String> curstr = new ArrayList<String>(asList(str1[0]));

        for(int i = 0; i < str2.length; i++){
            if(str2[i].equals(str1[0])){
                List<String> curpre1 = new ArrayList<String>();
                List<String> curpre2 = new ArrayList<String>();
                List<String> curin1 = asList(copyOfRange(str2,0,i));
                List<String> curin2 = asList(copyOfRange(str2,i+1,str2.length));
                for(int j = 1; j < str1.length; j++){
                    if(curin1.contains(str1[j])){
                        curpre1.add(str1[j]);
                    }else{
                        curpre2.add(str1[j]);
                    }
                }
                String[] test1= curpre1.toArray(new String[curpre1.size()]);
                String[] test2= curin1.toArray(new String[curin1.size()]);
                String[] test3= curpre2.toArray(new String[curpre2.size()]);
                String[] test4= curin2.toArray(new String[curin2.size()]);
                curstr.addAll(findpre(test1, test2));
                if(test1.length==1){
                    treefinal.add(test1[0]);
                }
                curstr.addAll(findpre(test3, test4));
                if(test3.length==1){
                    treefinal.add(test3[0]);
                }
                break;
            }
        }return curstr;
    }

    public static List<String> findback2(String[] str1, String[] str2){
        if(str1.length==0){
            return new ArrayList<String>();
        }
        List<String> curstr = new ArrayList<String>();
        for(int i = 0; i < str2.length; i++){
            if(str2[i].equals(str1[0])){
                List<String> curpre1 = new ArrayList<String>();
                List<String> curpre2 = new ArrayList<String>();
                List<String> curin1 = asList(copyOfRange(str2,0,i));
                List<String> curin2 = asList(copyOfRange(str2,i+1,str2.length));
                for(int j = 1; j < str1.length; j++){
                    if(curin1.contains(str1[j])){
                        curpre1.add(str1[j]);
                    }else{
                        curpre2.add(str1[j]);
                    }
                }
                String[] test1= curpre1.toArray(new String[curpre1.size()]);
                String[] test2= curin1.toArray(new String[curin1.size()]);
                curstr.addAll(findback2(test1, test2));
                curstr.addAll(findback2(curpre2.toArray(new String[curpre2.size()]),curin2.toArray(new String[curin2.size()])));
                curstr.add(str1[0]);
                break;
            }
        }return curstr;
    }
    
    
}


发表于 2020-05-07 16:25:11 回复(0)
//关键是重建一颗二叉树
#include<bits/stdc++.h>
using namespace std;
struct treeNode{
    int val;
    treeNode*left;
    treeNode*right;
    treeNode(int x):val(x),left(nullptr),right(nullptr){}
};
treeNode*reConstruct(vector<int>lay,vector<int>vin){
    if(vin.size()==0)return nullptr;
    int temp=lay[0];
    treeNode*head=new treeNode(temp);
    int tag=0;
    for(int i=0;i<vin.size();i++){
        if(vin[i]==temp){
            tag=i;
            break;
        }
    }
    vector<int> vinleft(vin.begin(),vin.begin()+tag);
    vector<int> vinright(vin.begin()+tag+1,vin.end());
    vector<int>layleft,layright;
    for(int i=1;i<lay.size();i++){
        for(int j=0;j<tag;j++){
            if(lay[i]==vin[j]){
                layleft.push_back(lay[i]);
                break;
            }
        }
    }
    for(int i=1;i<lay.size();i++){
        for(int j=tag+1;j<vin.size();j++){
            if(lay[i]==vin[j]){
                layright.push_back(lay[i]);
                break;
            }
        }
    }
    head->left=reConstruct(layleft,vinleft);
    head->right=reConstruct(layright,vinright);
    return head;
}
void leafOrder(treeNode*head,vector<int>&leaf){
    if(head==nullptr)return ;
    if(head->left==nullptr&&head->right==nullptr)
        leaf.push_back(head->val);
    if(head->left!=nullptr)
    leafOrder(head->left,leaf);
    if(head->right!=nullptr)
    leafOrder(head->right,leaf);
}
void preOrder(treeNode*head,vector<int>&pre){
    if(head==nullptr)return ;
    pre.push_back(head->val);
    preOrder(head->left,pre);
    preOrder(head->right,pre);
}
void posOrder(treeNode*head,vector<int>&pos){
    if(head==nullptr)return ;
    posOrder(head->left,pos);
    posOrder(head->right,pos);
    pos.push_back(head->val);
}
int main(){
    vector<int>lay,vin,pre,leaf,pos;
    int a,b;
    while(cin>>a){
        lay.push_back(a);
        if(cin.get()=='\n')break;
    }
    while(cin>>b){
        vin.push_back(b);
        if(cin.get()=='\n')break;
    }
    treeNode*head=reConstruct(lay,vin);
    leafOrder(head,leaf);
    preOrder(head,pre);
    posOrder(head,pos);
    for(int i=0;i<leaf.size();i++)
        cout<<leaf[i]<<" ";
    cout<<endl;
    for(int i=0;i<pre.size();i++)
        cout<<pre[i]<<" ";
    cout<<endl;
    for(int i=0;i<pos.size();i++)
        cout<<pos[i]<<" ";
    cout<<endl;
    return 0;
}


发表于 2020-02-29 12:11:58 回复(0)
数据结构的题答案都很长
核心在于用递归,层次遍历的第一个数一定是根
#include<bits/stdc++.h>
using namespace std;
const int maxn = 2050;
int arr[maxn];

vector<int> pre, post, leaves;

struct Node{
	int val;
	Node *left, *right;
	Node(int x):val(x) {left = right = NULL;}
};

Node *insert(vector<int> layer, vector<int> m_order) {
	if(layer.size() == 0) return NULL;
	int idx = 0;
	for(idx; idx < m_order.size(); idx++) if(layer[0] == m_order[idx]) break;
	Node *cur = new Node(m_order[idx]);
	if(m_order.size() == 1) return cur;

	vector<int> left_layer;//左子树的层次遍历
	for(int i = 1; i < layer.size(); i++) 
		for(int j = 0; j < idx; j++) 
			if(layer[i] == m_order[j]) left_layer.push_back(layer[i]);
	cur->left = insert(left_layer, vector<int>(m_order.begin(), m_order.begin()+idx));

	vector<int> right_layer;//右子树的层次遍历
    for(int i = 1; i < layer.size(); i++) 
		for(int j = idx + 1; j < m_order.size(); j++) 
			if(layer[i] == m_order[j]) right_layer.push_back(layer[i]);
	cur->right = insert(right_layer, vector<int>(m_order.begin()+idx+1, m_order.end()));
	return cur;
}

void pre_order(Node* head) {
	if(head) {
		if(!head->left && !head->right) 
			leaves.push_back(head->val);
		pre.push_back(head->val);
		pre_order(head->left);
		pre_order(head->right);
	}
}

void post_order(Node *head) {
	if(head) {
		post_order(head->left);
		post_order(head->right);
		post.push_back(head->val);
	}
}

void print_vec(vector<int> a) {
	for(int i = 0; i < a.size() - 1; i++)
		cout<<a[i]<<" ";
	cout<<a[a.size()-1]<<endl;
}

int main() {
	int cnt = 0, x;
	while(cin>>x) arr[cnt++] = x;
	int n = cnt / 2;
	vector<int> layer(arr, arr+n);
	vector<int> m_order(arr+n, arr+cnt);
	Node* head = insert(layer, m_order);
	pre_order(head); post_order(head);
	print_vec(leaves);
	print_vec(pre);
	print_vec(post);
}
/*
3 5 4 2 6 7 1
2 5 3 6 4 7 1
*/


编辑于 2020-01-16 12:04:19 回复(0)
#include <bits/stdc++.h>
using namespace std;

struct Tree{
    int val;
    Tree *left, *right;
    Tree(int val):val(val), left(NULL), right(NULL){}
};

Tree *Build(vector<int> level, vector<int> in, int s, int e){
    if(level.empty())
        return NULL;
    Tree *T = new Tree(level[0]);
    vector<int> l, r;
    int k=s;
    bool isleft;
    while(in[k]!=level[0])
        k++;
    for(int i=1;i<level.size();i++){
        isleft = false;
        for(int j=s;j<k;j++){
            if(level[i]==in[j]){
                isleft = true;
                break;
            }
        }
        if(isleft)
            l.push_back(level[i]);
        else
            r.push_back(level[i]);
    }
    T->left = Build(l, in, s, k-1);
    T->right = Build(r, in, k+1, e);
    return T;
}

void Leaves(Tree *T, vector<int> &leaf){
    if(!T)
        return;
    if(T->left==NULL && T->right==NULL){
        leaf.push_back(T->val);
        return;
    }
    Leaves(T->left, leaf);
    Leaves(T->right, leaf);
}

void PreOrder(Tree *T, vector<int> &pre){
    if(!T)
        return;
    pre.push_back(T->val);
    PreOrder(T->left, pre);
    PreOrder(T->right, pre);
}

void PostOrder(Tree *T, vector<int> &post){
    if(!T)
        return;
    PostOrder(T->left, post);
    PostOrder(T->right, post);
    post.push_back(T->val);
}

void Print(vector<int> v){
    for(int i=0;i<v.size();i++){
        if(i==v.size()-1)
            cout<<v[i]<<endl;
        else
            cout<<v[i]<<" ";
    }
}

int main(){
    vector<int> a, b;
    int x;
    while(cin>>x){
        a.push_back(x);
        if(getchar()=='\n')
            break;
    }
    while(cin>>x){
        b.push_back(x);
        if(getchar()=='\n')
            break;
    }
    Tree *T = Build(a, b, 0, b.size()-1);
    vector<int> pre, post, leaf;
    Leaves(T, leaf);
    Print(leaf);
    PreOrder(T, pre);
    Print(pre);
    PostOrder(T, post);
    Print(post);
    
    return 0;
}

发表于 2020-01-11 01:51:21 回复(0)
1,在中序数组找到第一个在层序数组中出现的结点的位置
2,对两边进行递归处理
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 笔试
{
    class TreeNode
    {
        public int val;
        public TreeNode(int val)
        {
            this.val = val;
        }
        public TreeNode left;
        public TreeNode right;
    }
    class Program
    {
        static void Main(string[] args)
        {
            string[] input1 = Console.ReadLine().Split(' ');
            string[] input2 = Console.ReadLine().Split(' ');
            int[] seq = new int[input1.Length];
            int[] tin = new int[input2.Length];
            //把输入信息转换为int数组
            for (int i = 0; i < seq.Length; i++)
            {
                seq[i] = int.Parse(input1[i]);
            }
            for (int i = 0; i < tin.Length; i++)
            {
                tin[i] = int.Parse(input2[i]);
            }
            
            TreeNode root = reConstructBinaryTree(seq, 0, seq.Length - 1, tin, 0, tin.Length - 1);
            FindLeft(root);
            foreach (var i in result)
            {
                Console.Write(i+" ");
            }
            Console.WriteLine();
            PreOrder(root);
            Console.WriteLine();
            PostOrder(root);

        }
        //存储叶子结点
        static List<int> result = new List<int>();
        //构建二叉树
        public static TreeNode reConstructBinaryTree(int[] seq, int seqStart, int seqEnd, int[] tin, int inStart, int inEnd)
        {
            if (seqStart > seqEnd || inStart > inEnd) return null;
            int i=0;
            int j=0;
            //在中序数组找到第一个在层序数组中出现的结点的位置
            for (i=seqStart ; i <= seqEnd; i++)
            {
                for ( j = inStart; j <=inEnd; j++)
                {
                    if (seq[i] == tin[j])
                    {
                        break;
                    }
                }
                //如果找到了就break
                if (j <= inEnd) break;
            }
            
            TreeNode root = new TreeNode(seq[i]);
            //找到的这个结点在中序数组中,左边是该数的左子树,右边是该结点的右子树,对两边递归
            root.left = reConstructBinaryTree(seq, seqStart + 1, seqEnd, tin, inStart, j - 1);
            root.right = reConstructBinaryTree(seq, seqStart + 1, seqEnd, tin, j + 1, inEnd);
            return root;

        }
        //前序遍历
        public static void PreOrder(TreeNode root)
        {
            if (root == null) return;
            Console.Write(root.val+" ");
            PreOrder(root.left);
            PreOrder(root.right);
        }
        //后序遍历
        public static void PostOrder(TreeNode root)
        {
            if (root == null) return;
            PostOrder(root.left);
            PostOrder(root.right);
            Console.Write(root.val + " ");
        }
        //查找叶子结点
        public static void FindLeft(TreeNode root)
        {
            if (root == null) return;
            if (root.left == null && root.right == null) result.Add(root.val);
            FindLeft(root.left);
            FindLeft(root.right);
        }
    }
}

编辑于 2019-10-01 15:45:57 回复(0)
关键问题在于根据中序和层序建树,之后的都好说了
除了建树函数,遍历前序、后序在这里均采用非递归方法
import java.util.*;
class TreeNode{
    int val;
    TreeNode left = null;
    TreeNode right = null;
    TreeNode(int val) {this.val = val;}
}
public class Main{
    public static void findLeaf(TreeNode root){
        if (root == null) return;
        TreeNode p = root;
        ArrayList<TreeNode> list = new ArrayList<>();
        Stack<TreeNode> stack = new Stack<>();
         while (!stack.isEmpty()||p != null){
            if (p != null){
                stack.push(p);
                p = p.left;
            }
            else {
                p = stack.pop();
                if (p.right == null&&p.left == null) list.add(p);
                p = p.right;
            }
        }
        for (int i=0;i<list.size();i++)
            System.out.print(list.get(i).val+" ");
        System.out.println();
    }
    public static void PrePrint(TreeNode root){
        if (root == null) return;
        Stack<TreeNode> stack = new Stack<>();
        TreeNode p = root;
        while (p != null||!stack.isEmpty()){
            if (p != null){
                System.out.print(p.val+" ");
                stack.push(p);
                p = p.left;
            }
            else {
                p = stack.pop();
                p = p.right;
            }
        }
        System.out.println();
    }
    public static void PostPrint(TreeNode root){
        if (root == null) return;
        Stack<TreeNode> stack = new Stack<>();
        TreeNode p = root, pL = root;
        while (p != null){
            stack.push(p);
            p = p.left;
        }
        while (!stack.isEmpty()){
            p = stack.pop();
            if (p.right == null||pL == p.right){
                System.out.print(p.val+" ");
                pL = p;
            }
            else {
                stack.push(p);
                p = p.right;
                while (p != null){
                    stack.push(p);
                    p = p.left;
                }
            }
        }
        System.out.println();
    }
    public static TreeNode reCon(int []lay, int []in){
        if (lay.length == 0) return null;
        TreeNode root = new TreeNode(lay[0]);
        ArrayList<Integer> left = new ArrayList<>();
        ArrayList<Integer> right = new ArrayList<>();
        int head = 0;
        for (;head < in.length;head++)
            if (in[head] == lay[0])
                break;
        boolean leftTree = false;
        for (int i=1;i<lay.length;i++){
            leftTree = false;
            for (int j=0;j<head;j++)
                if (lay[i] == in[j]){
                    leftTree = true;
                    break;
                }
            if (leftTree) left.add(lay[i]);
            else right.add(lay[i]);
        }
        int[] layleft = new int[left.size()];
        int[] layright = new int[right.size()];
        for (int i=0;i<left.size();i++)
            layleft[i] = left.get(i);
        for (int i=0;i<right.size();i++)
            layright[i] = right.get(i);
        root.left = reCon(layleft, Arrays.copyOfRange(in, 0, head));
        root.right = reCon(layright, Arrays.copyOfRange(in, head+1, in.length));
        return root;
    }
    public static void main(String []args){
        Scanner sc = new Scanner(System.in);
        while (sc.hasNextLine()){
            String []laystr = sc.nextLine().split(" ");
            String []instr = sc.nextLine().split(" ");
            int []lay = new int[laystr.length];
            int []in = new int[instr.length];
            for (int i=0;i<in.length;i++){
                lay[i] = Integer.valueOf(laystr[i]);
                in[i] = Integer.valueOf(instr[i]);
            }
            TreeNode root = reCon(lay, in);
            findLeaf(root);
            PrePrint(root);
            PostPrint(root);
        }
    }
}


发表于 2019-09-24 00:59:00 回复(0)
package com.hhdd.offer.xiaohongshu;

import java.util.Scanner;

/**
 * 根据中序遍历和层次遍历重建一棵二叉树
 * 中序遍历可以确定左子树和右子树的范围
 * 层次遍历可以确定在一个范围的子树中的层级关系
 * 故这二者的序列给定就一定可以唯一的确定一棵二叉树
 */
public class RecoverBTByLeverAndInOrder {

    public static class TreeNode {
        private int val;
        private TreeNode left;
        private TreeNode right;

        public TreeNode(int value) {
            this.val = value;
        }
    }


    public static TreeNode recoverBT(int[] level, int[] in) {
        return recoverBT(level, in, 0, in.length - 1);
    }

    public static TreeNode recoverBT(int[] level, int[] in, int iStart, int iEnd) {

        int index = findFirstNode(level, in, iStart, iEnd);
        if (index == -1) {
            return null;
        }
        TreeNode tree = new TreeNode(in[index]);
        tree.left = recoverBT(level, in, iStart, index - 1);
        tree.right = recoverBT(level, in, index + 1, iEnd);
        return tree;

    }

    /**
     * 在给定范围的中序遍历中,寻找第一个出现在层次遍历中的节点
     * 这个节点的层级一定是这个中序遍历中层级最高的
     *
     * @param level
     * @param in
     * @return 找到返回中序遍历的下标,没找到返回-1
     */
    public static int findFirstNode(int[] level, int[] in, int iStart, int iEnd) {

        for (int i = 0; i < level.length; i++) {
            for (int j = iStart; j <= iEnd; j++) {
                if (level[i] == in[j]) {
                    return j;
                }
            }
        }
        return -1;
    }

    /**
     * 前序遍历
     *
     * @param head
     */
    public static void preOrder(TreeNode head) {
        if (head == null) {
            return;
        }
        System.out.print(head.val + " ");
        preOrder(head.left);
        preOrder(head.right);
    }

    /**
     * 后序遍历
     *
     * @param head
     */
    public static void postOrder(TreeNode head) {
        if (head == null) {
            return;
        }
        postOrder(head.left);
        postOrder(head.right);
        System.out.print(head.val + " ");
    }

    /**
     * 打印叶子节点
     * 通过魔改前序遍历的方式
     *
     * @param head
     */
    public static void printLeafNode(TreeNode head) {
        if (head == null) {
            return;
        }
        //如果当前节点的左右子树都空,则是叶子节点,打印后直接返回
        if (head.left == null && head.right == null) {
            System.out.print(head.val + " ");
            return;
        }
        printLeafNode(head.left);
        printLeafNode(head.right);
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String s1 = scanner.nextLine();
        String s2 = scanner.nextLine();
        String[] strings1 = s1.split(" ");
        String[] strings2 = s2.split(" ");
        int[] level = new int[strings1.length];
        int[] in = new int[strings2.length];
        for (int i = 0; i < strings1.length; i++) {
            level[i] = Integer.parseInt(strings1[i]);
            in[i] = Integer.parseInt(strings2[i]);
        }
        TreeNode tree = recoverBT(level, in);

        printLeafNode(tree);
        System.out.println();
        preOrder(tree);
        System.out.println();
        postOrder(tree);
    }


}

发表于 2019-09-01 18:27:40 回复(0)
var readline = require('readline');
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});

//多行输入
var inputArr = [];
rl.on('line', function (input) {
    inputArr.push(input);
    if (inputArr.length === 2) {
        var floor = inputArr[0].split(' ');
        var mid = inputArr[1].split(' ');
        var leaves = [];

        function build(floor, mid) {
            var root = null;
            if (floor.length > 1) {
                var rootMidIdx = mid.indexOf(floor[0]);
                var midLeftList = mid.slice(0, rootMidIdx);
                var midRightList = mid.slice(rootMidIdx + 1);
                var floorLeftList = getSubFromFloor(floor, midLeftList);
                var floorRightList = getSubFromFloor(floor, midRightList);
                root = {
                    val: floor[0],
                    left: build(floorLeftList, midLeftList),
                    right: build(floorRightList, midRightList)
                }
            } else if (floor.length === 1) {
                root = {
                    val: floor[0],
                    left: null,
                    right: null
                };
                leaves.push(floor[0])
            }
            return root
        }

        var head = build(floor, mid);
        console.log(leaves.join(' '));
        var preList = [];
        var lrdList = [];

        function pre(head) {
            if (head.val) {
                preList.push(head.val)
                if (head.left) {
                    pre(head.left)
                }
                if (head.right) {
                    pre(head.right)
                }
            }
        }

        pre(head);

        function lrd(head) {
            if (head.val) {
                if (head.left) {
                    lrd(head.left)
                }
                if (head.right) {
                    lrd(head.right)
                }
                lrdList.push(head.val)
            }
        }

        lrd(head);
        console.log(preList.join(' '));
        console.log(lrdList.join(' '));
    }
});

function getSubFromFloor(floor, list) {
    var ans = [];
    for (var i = 0; i < floor.length; i++) {
        if (list.includes(floor[i])) {
            ans.push(floor[i])
        }
    }
    return ans
}

发表于 2019-08-25 17:45:09 回复(0)

Python解法

l1 = list(map(int,input().strip().split(" ")))
l2 = list(map(int,input().strip().split(" ")))

class Tree:
    def __init__(self,x):
        self.left = None
        self.right = None
        self.val = x

def fun(l1, l2):
    if len(l1) == 0:
        return None
    root = Tree(l1[0])
    sign = l2.index(l1[0])
    left_l2 = l2[:sign]
    left_l1 = [x for x in l1 if x in left_l2]
    right_l2 = l2[sign+1:]
    right_l1 = [x for x in l1 if x in right_l2]
    root.left = fun(left_l1, left_l2)
    root.right = fun(right_l1, right_l2)
    return root

root = fun(l1,l2)

res1 = []
res2 = []
res3 = []
def dfs(root):
    if root == None:
        return
    if(root.left == None and root.right == None):
        res1.append(root.val)
    res2.append(root.val)
    dfs(root.left)
    dfs(root.right)

def dfs1(root):
    if root == None:
        return
    dfs1(root.left)
    dfs1(root.right)
    res3.append(root.val)

dfs(root)
dfs1(root)

for e in res1:
    print(e, end=" ")
print()
for e in res2:
    print(e, end=" ")
print()
for e in res3:
    print(e,end=" ")
print()
发表于 2019-05-18 12:28:19 回复(1)
在中序遍历数组中找出一个数字,这个数字要求在层序遍历数组中的索引是最小的,那么这个数字就是跟,在中序遍历中,这个数字的左边为左子树,右边为右子树,这样分析后,一个递归的过程就很清楚了。

首先根据题目要求构造一个二叉树,然后用递归方法找出子叶,前序遍历和后续遍历结果即可。

class Node:
    def __init__(self, val):
        self.val = val
        self.left = None
        self.right = None
 
 
def construct(level, mid):
    if not level or not mid:
        return None
    l = []
    for num in mid:
        l.append(level.index(num))
    index = min(l)
    head = Node(level[index])
    i = l.index(index)
    head.left = construct(level, mid[:i])
    head.right = construct(level, mid[i + 1:])
    return head
 
leaf1 = []
def leaf(node):
    if not node:
        return
    if not node.left and not node.right:
        leaf1.append(str(node.val))
    leaf(node.left)
    leaf(node.right)
 
 
pre = []
 
 
def preorder(node):
    if not node:
        return
    pre.append(str(node.val))
    preorder(node.left)
    preorder(node.right)
 
 
post = []
 
 
def postorder(node):
    if not node:
        return
    postorder(node.left)
    postorder(node.right)
    post.append(str(node.val))
 
 
level = list(map(int, input().split()))
mid = list(map(int, input().split()))
head = construct(level, mid)
leaf(head)
preorder(head)
postorder(head)
print(' '.join(leaf1))
print(' '.join(pre))
print(' '.join(post))


发表于 2019-09-13 11:45:30 回复(0)
#include <iostream>
#include <vector>
#include <string>
using namespace std;
struct Tree
{
    int val;
    Tree* left;
    Tree* right;
    Tree(int n):val(n){left=NULL;right=NULL;};
};
Tree* reBuilt(vector<int> layer,const vector<int> &post, int lf,int rig)
{
    if(lf>rig) return NULL;
    if(lf==rig)
    {
        Tree* root=new Tree(layer[0]);
        cout<<root->val<<" ";
        return root;
    };
    Tree* root=new Tree(layer[0]);
    int pos=0;
    for(int i=lf;i<=rig;i++)
        if(post[i]==layer[0])
        {
            pos=i;
            break;
        }
   //找到根所在位置
    vector<int> leftTree;
    vector<int> rightTree;
    for(int i=1;i<layer.size();i++)
    {
        bool isleft=false;
        for(int j=lf;j<pos;j++) //检索左树
            if(post[j]==layer[i])
            {
               isleft=true;
               break;
            }
        if(isleft) leftTree.push_back(layer[i]);
        else rightTree.push_back(layer[i]); 
     }
    //左右树分类完毕
    root->left=reBuilt(leftTree, post, lf, pos-1);
    root->right=reBuilt(rightTree, post, pos+1, rig);
    return root;
}
void PreOrder(Tree *root)
{
    if(root==NULL) 
        return;
    cout<<root->val<<" ";
    PreOrder(root->left);
    PreOrder(root->right);
}
void AfterOrder(Tree *root)
{
     if(root==NULL) 
        return;
    AfterOrder(root->left);
    AfterOrder(root->right);   
    cout<<root->val<<" ";
}
int main()
{
    vector<int> layer;
    vector<int> post;
    string tmp;
    getline(cin,tmp);
    int num=0;
    for(int i=0;i<tmp.length();i++)
    {
       if(tmp[i]!=' ') 
       {
           num*=10;
           num+=tmp[i]-'0';
       }
       if(tmp[i]==' '||i==tmp.length()-1)
        {
            layer.push_back(num);
       //     cout<<layer.back()<<" ";
            num=0;
        }
    }
   // cout<<endl;
    getline(cin,tmp);
    num=0;
    for(int i=0;i<tmp.length();i++)
    {
       if(tmp[i]!=' ') 
       {
           num*=10;
           num+=tmp[i]-'0';
       }
         if(tmp[i]==' '||i==tmp.length()-1)
        {
            post.push_back(num);
         //   cout<<post.back()<<" ";
            num=0;
        }
    }
    //获取数据完成
    Tree* root=reBuilt(layer, post, 0,post.size()-1);
    cout<<endl;
    PreOrder(root);
        cout<<endl;
   AfterOrder(root);
       cout<<endl;
    return 0;
}

发表于 2020-12-18 10:06:14 回复(0)
//层序遍历和中序遍历重建二叉树
import java.util.Arrays;
import java.util.ArrayList;
import java.util.Scanner;
public class Main{
    class TreeNode{
        int val = 0;
        TreeNode left = null;
        TreeNode right = null;
        TreeNode(int val){
            this.val = val;
        }
    }
    private ArrayList<Integer> leaves = new ArrayList<Integer>(); 
    private ArrayList<Integer> pre = new ArrayList<>();
    private ArrayList<Integer> last = new ArrayList<>();
    
    //找出数组中某个元素的坐标
    public int findIndex(int[] array, int val){
        for(int i = 0; i < array.length; i++){
            if(array[i] == val)
                return i;
        }
        return -1;
    }
    
    //重建二叉树
    public TreeNode constructT(int[] layer, int[] mid){
        if(layer.length == 0) return null;
        if(layer.length == 1){
            leaves.add(layer[0]);
            TreeNode node = new TreeNode(layer[0]);
            return node;
        }
        //根节点
        int val = layer[0];
        TreeNode root = new TreeNode(val);
        //将中序遍历根据根节点分为左右两棵子树的中序遍历
        int index = findIndex(mid, val);
        if(index == 0)
            root.left = null;
        else{
            int[] left = Arrays.copyOfRange(mid,0, index);
            //在层序遍历数组layer中找出左子树的层序遍历数组
            int[] layerl = new int[left.length];
            for(int i = 0,j=0; i < layer.length&&j < left.length;i++){
                if(findIndex(left,layer[i])!=-1){
                    layerl[j] = layer[i];
                    j++;
                }
            }
            root.left = constructT(layerl,left);
        }
        if(index == mid.length-1)
            root.right = null;
        else{
            int[] right = Arrays.copyOfRange(mid,index+1, mid.length);
            //在层序遍历数组layer中找出右子树的层序遍历数组,为了节省时间,倒序查找
            int[] layerr = new int[right.length];
            for(int i = layer.length-1,j=right.length-1; i >=0&&j >=0;i--){
                if(findIndex(right,layer[i])!=-1){
                    layerr[j] = layer[i];
                    j--;
                }
            }
            root.right = constructT(layerr,right);
        }
        return root;
    }
    
    public void preOrder(TreeNode root){
        if(root != null){
            pre.add(root.val);
            preOrder(root.left);
            preOrder(root.right);
        }
    }
    
    public void lastOrder(TreeNode root){
        if(root != null){
            lastOrder(root.left);
            lastOrder(root.right);
            last.add(root.val);
        }
    }
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        String first = in.nextLine();
        String second = in.nextLine();
        String[] f = first.split(" ");
        String[] s = second.split(" ");
        if(s.length == 0){
            System.out.println();
            System.out.println();
            System.out.println();
            return;
        }
        int[] layer = new int[f.length];
        int[] mid = new int[s.length];
        for(int i = 0; i < f.length; i++){
            layer[i] = Integer.valueOf(f[i]);
            mid[i] = Integer.valueOf(s[i]);
        }
        Main m = new Main();
        TreeNode root = m.constructT(layer,mid);
        m.preOrder(root);
        m.lastOrder(root);
        for(int i = 0; i < m.leaves.size(); i++){
            System.out.print(m.leaves.get(i)+" ");
        }
        System.out.println();
        for(int i = 0; i < m.pre.size(); i++){
            System.out.print(m.pre.get(i)+" ");
        }
        System.out.println();
        for(int i = 0; i < m.last.size(); i++){
            System.out.print(m.last.get(i)+" ");
        }
        System.out.println();
    }
}

发表于 2020-06-03 15:09:48 回复(0)
import java.util.Arrays;
import java.util.Scanner;

class Treenode{
    public int val;
    public Treenode left;
    public Treenode right;
    public Treenode(int val) {
        this.val = val;
        this.left = null;
        this.right = null;
    }
    public Treenode() {
    }    
}
public class Main {
    private static StringBuffer preorderBuffer=new StringBuffer();
    private static StringBuffer postorderBuffer=new StringBuffer();
    private static StringBuffer leafs=new StringBuffer();
    
    
    
    private static void preorder(Treenode root){
        if(root!=null) {
            preorderBuffer.append(root.val+" ");
            preorder(root.left);
            preorder(root.right);
        }
    }
    
    private static void postorder(Treenode root){
        if(root!=null) {
            postorder(root.left);
            postorder(root.right);
            postorderBuffer.append(root.val+" ");
        }
    }
    
    private static Treenode getTreeNode(int[] indexinlevel,int[] midOrder,int from, int to){
        if(to<from) return null;
        if(from==to){
            Treenode result=new Treenode(midOrder[from]);
            leafs.append(midOrder[from]+" ");
            return result;
        }
        int minindex=from;
        for(int i=from+1;i<=to;i++) {
            if(indexinlevel[i]<indexinlevel[minindex])
                minindex=i;
        }
        Treenode result=new Treenode(midOrder[minindex]);
        result.left=getTreeNode(indexinlevel,midOrder,from,minindex-1);
        result.right=getTreeNode(indexinlevel,midOrder,minindex+1,to);
        return result;
    }
    
    private static Treenode getTree(int[] levelOrder,int[] midOrder){
        int[] indexinlevel=new int[midOrder.length];
        for(int i=0;i<midOrder.length;i++) {
            for(int j=0;j<levelOrder.length;j++) {
                if(midOrder[i]==levelOrder[j]) {
                    indexinlevel[i]=j;
                }
            }
        }
        Treenode tree=getTreeNode(indexinlevel,midOrder,0,midOrder.length-1);    
        return tree;
    }
    
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        String str1=scanner.nextLine();
        String str2=scanner.nextLine();
        String[] s1=str1.split(" ");
        int[] params1=new int[s1.length];
        String[] s2=str2.split(" ");
        int[] params2=new int[s2.length];
        for(int i=0;i<s1.length;i++)
        {
            params1[i]=Integer.parseInt(s1[i]);
        }
        for(int i=0;i<s2.length;i++)
        {
            params2[i]=Integer.parseInt(s2[i]);
        }
        scanner.close();
        Treenode tree=getTree(params1,params2);
        preorder(tree);
        postorder(tree);
        System.out.println(leafs.toString().trim());
        System.out.println(preorderBuffer.toString().trim());
        System.out.println(postorderBuffer.toString().trim());
    }
}
先将中序遍历中的数字,在层序遍历中依次找出,并存储相应层序遍历中的索引。每次根节点都取这个索引数组中最小的值。大概就是这样

发表于 2020-04-19 01:45:18 回复(0)
构建一棵完全二叉树
#include<bits/stdc++.h>
using namespace std;

int zu[3000];
void Pre(int i){
	cout<<zu[i]<<" ";
	if(zu[i*2]!=0)
	Pre(i*2);
	if(zu[i*2+1]!=0)
	Pre(i*2+1);
}
void Post(int i){
	if(zu[i*2]!=0)
	Post(i*2);
	if(zu[i*2+1]!=0)
	Post(i*2+1);
	cout<<zu[i]<<" ";
}
void In(int i){
	if(zu[i*2]==0&&zu[i*2+1]==0)
	{
		cout<<zu[i]<<" "; return;
	}
	if(zu[i*2]!=0)
	In(i*2);
	if(zu[i*2+1]!=0)
	In(i*2+1);
}

int main(){
	int low,high,shu[3000],len[3000][2];
	int pos=1,x;
	while(cin>>x){
		shu[pos++]=x;
	} 
	for(int i=1;i<3000;i++)  //初始化
	{
		len[i][0]=-1; zu[i]=0;
	}
	high=pos-1;    //中序遍历序列的右端
	low=high/2+1;   //中序遍历序列的左端
	len[1][0]=low;
	len[1][1]=high;
	int i=1;pos=1;
	while(i<=low-1){    //构建完全二叉树
		if(len[pos][0]>len[pos][1]||len[pos][0]==-1){
			pos++; continue;
		}
		int j;
		for(j=len[pos][0];j<=len[pos][1];j++)
			if(shu[j]==shu[i])
				break;
		len[2*pos][0]=len[pos][0];
		len[2*pos][1]=j-1;
		len[2*pos+1][0]=j+1;
		len[2*pos+1][1]=len[pos][1];
		zu[pos++]=shu[i++];
	}
	In(1);    //打印叶子节点
	cout<<endl;
	Pre(1);
	cout<<endl;
	Post(1);
}


发表于 2020-04-10 10:50:43 回复(0)
题不是很难,主要难点在于通过层序遍历与中序遍历重建二叉树,树建好了剩下的也就只是小儿科了,应该还能再优化下 
function TreeNode(x) {
    this.val = x;
    this.left = null;
    this.right = null;
}
// 重建二叉树
function reConstructBinaryTree(lev, vin) {
    if (!lev.length || !vin.length) return null;
    const rootVal = lev[0];
    const node = new TreeNode(rootVal);
    let i = 0;
    let levLeft = [];
    let levRight = [];
    for (; i < vin.length; i++) {
        if (vin[i] == rootVal) break;
    }
    for (let k = 0; k < lev.length; k++) {
        for (let j = 0; j < i; j++) {
            if (lev[k] == vin[j]) {
                levLeft.push(lev[k]);
            }
        }
        for (let j = vin.length - 1 ; j > i ; j--) {
            if (lev[k] == vin[j]) {
                levRight.push(lev[k]);
            }
        }
    }
    node.left = reConstructBinaryTree(levLeft, vin.slice(0,i));
    node.right = reConstructBinaryTree(levRight, vin.slice(i + 1));
    return node;
}
// 从左到右节点
let LTR = [];
function ltrTree(tn) {
    if (tn === null) return null;
    ltrTree(tn.left);
    ltrTree(tn.right);
    if (tn.left === null && tn.right === null) {
        LTR.push(tn.val);
    }
}
// 先序遍历
let PRE = [];
function preTree(tn) {
    if (tn === null) return null;
    PRE.push(tn.val);
    preTree(tn.left);
    preTree(tn.right);
}
// 后序遍历
let LRD = [];
function lrdTree(tn) {
    if (tn === null) return;
    lrdTree(tn.left);
    lrdTree(tn.right);
    LRD.push(tn.val);
}
let LEV = readline().split(' ');
let VIN = readline().split(' ');
let tree = reConstructBinaryTree(LEV, VIN);
ltrTree(tree);
preTree(tree);
lrdTree(tree);
print(LTR.join(' '));
print(PRE.join(' '));
print(LRD.join(' '));

发表于 2020-03-03 18:35:34 回复(0)
//二叉树4种遍历都写进去了,需要的自行留存
#include<iostream>
#include<string>
#include<queue>
#include<vector>
using namespace std;
class TreeNode {//针对对象值为整形
public:
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int value) :val(value) { this->left = this->right = NULL; };
};
TreeNode* Construct(vector<int>pre, vector<int>vin) {//前序+中序可以构建,中序加后序也可以
    if (pre.size() == 0 || vin.size() == 0) { return NULL; }
    TreeNode* root = new TreeNode(pre[0]);
    root->left = root->right = NULL;
    vector<int>leftpre, rightpre, leftvin, rightvin;
    int i = 0;
    for (; i<vin.size(); ++i) {
        if (vin[i] == pre[0]) { break; }
        leftvin.push_back(vin[i]);
    }
    if (i <= vin.size()) {
        for (int j = i + 1; j<vin.size(); ++j) {
            rightvin.push_back(vin[j]);
        }
        for (int j = 1; j <= i; ++j) {
            leftpre.push_back(pre[j]);
        }
        for (int j = i + 1; j<vin.size(); ++j) {
            rightpre.push_back(pre[j]);
        }
        root->left = Construct(leftpre, leftvin);
        root->right = Construct(rightpre, rightvin);
        return root;
    }
    else {
        return NULL;
    }
}
bool IN(const int&temp, const vector<int>&temp2) {
    for (int i = 0; i < temp2.size(); ++i) {
        if (temp == temp2[i]) { return true; }
    }
    return false;
}
TreeNode* Construct2(vector<int>order, vector<int>vin) {
    if (order.size() == 0 || vin.size() == 0) { return NULL; }
    TreeNode* root = new TreeNode(order[0]);
    root->left = root->right = NULL;
    vector<int>leftorder, rightorder, leftvin, rightvin;
    int i = 0;
    for (; i<vin.size(); ++i) {
        if (vin[i] == order[0]) { break; }
        leftvin.push_back(vin[i]);
    }
    if (i <= vin.size()) {
        for (int j = i + 1; j<vin.size(); ++j) {
            rightvin.push_back(vin[j]);
        }
        for (int j = 1; j <order.size(); ++j) {
            if (IN(order[j], leftvin))leftorder.push_back(order[j]);
            if (leftorder.size() == leftvin.size())break;
        }

        for (int j = 1; j<vin.size(); ++j) {
            if (IN(order[j], rightvin))rightorder.push_back(order[j]);
            if (rightorder.size() == rightvin.size())break;
        }
        if (leftorder.size() != leftvin.size() || rightorder.size() != rightvin.size())return NULL;
        root->left = Construct2(leftorder, leftvin);
        root->right = Construct2(rightorder, rightvin);
        return root;
    }
    else {
        return NULL;
    }
}
void firstsearch(TreeNode* temp, vector<int>&vec) {
    if (temp == NULL)return;
    if (temp != NULL)vec.push_back(temp->val);
    if (temp->left != NULL) { firstsearch(temp->left, vec); }
    if (temp->right != NULL) { firstsearch(temp->right, vec); }
}
void midsearch(TreeNode* temp, vector<int>&vec) {
    if (temp == NULL)return;
    if (temp->left != NULL) { midsearch(temp->left, vec); }
    vec.push_back(temp->val);
    if (temp->right != NULL) { midsearch(temp->right, vec); }
}
void lastsearch(TreeNode* temp, vector<int>&vec) {
    if (temp == NULL)return;
    if (temp->left != NULL) { lastsearch(temp->left, vec); }
    if (temp->right != NULL) { lastsearch(temp->right, vec); }
    vec.push_back(temp->val);
}

void ordersearch(queue<TreeNode*>&t, vector<int>&vec) {
    queue<TreeNode*>temp;
    while (t.size() > 0) {
        TreeNode* root = t.front(); t.pop();
        vec.push_back(root->val);
        if (root->left != NULL) { temp.push(root->left); }
        if (root->right != NULL) { temp.push(root->right); }
    }
    t = temp;
    if (temp.size() == 0) { return; }
    else {
        ordersearch(t, vec);
    }
}
void search(TreeNode* temp, vector<int>&vec) {//搜索叶子结点从左至右
    if (temp != NULL && temp->left == NULL && temp->right == NULL)vec.push_back(temp->val);
    if (temp->left != NULL) { search(temp->left, vec); }
    if (temp->right != NULL) { search(temp->right, vec); }
}

int main() {
    vector<int>m_a, m_b, m_c, m_d, m_e, m_f, m_g;
    int a, b;
    while (cin>>a) {
        m_a.push_back(a);
        if (cin.get() == '\n') { break; }
    }
    while (cin >> b) {
        m_b.push_back(b);
        if (cin.get() == '\n') { break; }
    }
    //b= cin.get();
    //while (b != '\n') {
    //    if (b == ' ') { b = cin.get(); continue; }
    //    m_b.push_back(b);
    //    b = cin.get();
    //}
    TreeNode* root = Construct2(m_a, m_b);
    firstsearch(root, m_c);
    lastsearch(root, m_e);
    search(root, m_g);
    for (int i = 0; i<m_g.size(); ++i) { cout << m_g[i]<<' '; }cout << endl;
    for (int i = 0; i<m_c.size(); ++i) { cout << m_c[i]<<' '; }cout << endl;
    for (int i = 0; i<m_e.size(); ++i) { cout << m_e[i]<<' '; }cout << endl;
    cin.get();
    cin.get();
    return 0;
}
发表于 2020-01-31 17:16:54 回复(0)