java怎么求偏态函数_树的不同形态

4

/**

*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

if(a[0].equals(s2[index])) break;

}

ArrayList list1=new ArrayList(Arrays.asList(a));

ArrayList list2=new ArrayList(Arrays.asList(a));

for(int i=0;i<=index;i++)

list1.remove(s2[i]);

for(int i=index;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)

5

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)

2

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[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 

// 是左的放左,否则就是右的,放右

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)

2

#include

#include

#include

#include

#include

using namespace std;

struct TreeNode

{

int val;

TreeNode *left,*right;

TreeNode(int v):val(v),left(nullptr),right(nullptr){}

};

TreeNode* createTree(vectorinorder,vectorseq,int begin,int end)

{

if(seq.size()<=0) return nullptr;

TreeNode *root=new TreeNode(seq[0]);

vectorleft;

vectorright;

int k;

for(k=begin;k<=end;++k)

if(inorder[k]==seq[0])

break;

bool isleft;

for(int i=1;i

{

isleft=false;

for(int j=begin;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&pre)

{

if(ptr!=nullptr)

{

pre.push_back(ptr->val);

preorder(ptr->left,pre);

preorder(ptr->right,pre);

}

}

void postorder(TreeNode *ptr,vector&post)

{

if(ptr!=nullptr)

{

postorder(ptr->left,post);

postorder(ptr->right,post);

post.push_back(ptr->val);

}

}

void getleafNode(TreeNode *ptr,vector&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];

vectorinorder;

vectorseq;

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);

vectorpre,post,leaf;

preorder(root,pre);

postorder(root,post);

getleafNode(root,leaf);

for(int i=0;i

cout<

cout<

for(int i=0;i

cout<

 
 

cout<

for(int i=0;i

cout<

cout<

return 0;

}

发表于 2019-05-17 10:50:24

回复(0)

1

没有重建出来整棵树,但是也是通过递归来类似的遍历重建树的过程,并在过程中通过存入一个链表来维护。

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 pre = Main.findpre(str1,str2);

List back = Main.findback2(str1,str2);

System.out.print(treefinal.get(0));

for(int i = 1; i 

System.out.print(" ");

System.out.print(treefinal.get(i));

}

System.out.println();

System.out.print(pre.get(0));

for(int i = 1; i 

System.out.print(" ");

System.out.print(pre.get(i));

}

System.out.println();

System.out.print(back.get(0));

for(int i = 1; i 

System.out.print(" ");

System.out.print(back.get(i));

}

}

public static List findpre(String[] str1, String[] str2){

if(str1.length==0){

return new ArrayList();

}

List curstr = new ArrayList(asList(str1[0]));

for(int i = 0; i 

if(str2[i].equals(str1[0])){

List curpre1 = new ArrayList();

List curpre2 = new ArrayList();

List curin1 = asList(copyOfRange(str2,0,i));

List curin2 = asList(copyOfRange(str2,i+1,str2.length));

for(int j = 1; 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 findback2(String[] str1, String[] str2){

if(str1.length==0){

return new ArrayList();

}

List curstr = new ArrayList();

for(int i = 0; i 

if(str2[i].equals(str1[0])){

List curpre1 = new ArrayList();

List curpre2 = new ArrayList();

List curin1 = asList(copyOfRange(str2,0,i));

List curin2 = asList(copyOfRange(str2,i+1,str2.length));

for(int j = 1; 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)

1

//关键是重建一颗二叉树

#include

using namespace std;

struct treeNode{

int val;

treeNode*left;

treeNode*right;

treeNode(int x):val(x),left(nullptr),right(nullptr){}

};

treeNode*reConstruct(vectorlay,vectorvin){

if(vin.size()==0)return nullptr;

int temp=lay[0];

treeNode*head=new treeNode(temp);

int tag=0;

for(int i=0;i

if(vin[i]==temp){

tag=i;

break;

}

}

vector vinleft(vin.begin(),vin.begin()+tag);

vector vinright(vin.begin()+tag+1,vin.end());

vectorlayleft,layright;

for(int i=1;i

for(int j=0;j

if(lay[i]==vin[j]){

layleft.push_back(lay[i]);

break;

}

}

}

for(int i=1;i

for(int j=tag+1;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&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&pre){

if(head==nullptr)return ;

pre.push_back(head->val);

preOrder(head->left,pre);

preOrder(head->right,pre);

}

void posOrder(treeNode*head,vector&pos){

if(head==nullptr)return ;

posOrder(head->left,pos);

posOrder(head->right,pos);

pos.push_back(head->val);

}

int main(){

vectorlay,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

cout<

cout<

for(int i=0;i

cout<

 
 

cout<

for(int i=0;i

cout<

cout<

return 0;

}

发表于 2020-02-29 12:11:58

回复(0)

1

数据结构的题答案都很长

核心在于用递归,层次遍历的第一个数一定是根

#include

using namespace std;

const int maxn = 2050;

int arr[maxn];

vector pre, post, leaves;

struct Node{

int val;

Node *left, *right;

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

};

Node *insert(vector layer, vector m_order) {

if(layer.size() == 0) return NULL;

int idx = 0;

for(idx; idx 

Node *cur = new Node(m_order[idx]);

if(m_order.size() == 1) return cur;

vector left_layer;//左子树的层次遍历

for(int i = 1; i 

for(int j = 0; j 

if(layer[i] == m_order[j]) left_layer.push_back(layer[i]);

cur->left = insert(left_layer, vector(m_order.begin(), m_order.begin()+idx));

vector right_layer;//右子树的层次遍历

for(int i = 1; i 

for(int j = idx + 1; j 

if(layer[i] == m_order[j]) right_layer.push_back(layer[i]);

cur->right = insert(right_layer, vector(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 a) {

for(int i = 0; i 

cout<

cout<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值