热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

求二叉树的中值数组

求二叉树的中值数组原文:https://www.geesfo

求二叉树的中值数组

原文:https://www . geesforgeks . org/find-中值数组换二叉树/

先决条件: 树遍历(有序、前序和后序)、中值
给定一棵具有整数节点的二叉树,任务是为树的前序、后序和有序遍历中的每个位置找到中值。

中值数组是借助于树的前序、后序和有序遍历形成的数组,这样
med[i] =中值(前序[i]、有序[i]、有序[i])

例:

Input: Tree =
1
/ \
2 3
/ \
4 5
Output: {4, 2, 4, 3, 3}
Explanation:
Preorder traversal = {1 2 4 5 3}
Inorder traversal = {4 2 5 1 3}
Postorder traversal = {4 5 2 3 1}
median[0] = median(1, 4, 4) = 4
median[1] = median(2, 2, 5) = 2
median[2] = median(4, 5, 2) = 4
median[3] = median(5, 1, 3) = 3
median[4] = median(3, 3, 1) = 3
Hence, Median array = {4 2 4 3 3}
Input: Tree =
25
/ \
20 30
/ \ / \
18 22 24 32
Output: 18 20 20 24 30 30 32

进场:


  • 首先,找到给定二叉树的前序、后序和有序遍历,并将它们分别存储在向量中。

  • 现在,对于从 0 到 N 的每个位置,将每个遍历数组中该位置的值插入一个向量。矢量大小为 3N。

  • 最后,对这个向量进行排序,这个位置的中位数由第二元素给出。在这个向量中,它有 3N 个元素。因此在排序之后,中间的元素,第二个元素,每 3 个元素给出一个中间值。

以下是上述方法的实现:

卡片打印处理机(Card Print Processor 的缩写)

// C++ program to Obtain the median
// array for the preorder, postorder
// and inorder traversal of a binary tree
#include
using namespace std;
// A binary tree node has data,
// a pointer to the left child
// and a pointer to the right child
struct Node {
    int data;
    struct Node *left, *right;
    Node(int data)
    {
        this->data = data;
        left = right = NULL;
    }
};
// Postorder traversal
void Postorder(
    struct Node* node,
    vector& postorder)
{
    if (node == NULL)
        return;
    // First recur on left subtree
    Postorder(node->left, postorder);
    // then recur on right subtree
    Postorder(node->right, postorder);
    // now deal with the node
    postorder.push_back(node->data);
}
// Inorder traversal
void Inorder(
    struct Node* node,
    vector& inorder)
{
    if (node == NULL)
        return;
    // First recur on left child
    Inorder(node->left, inorder);
    // then print the data of node
    inorder.push_back(node->data);
    // now recur on right child
    Inorder(node->right, inorder);
}
// Preorder traversal
void Preorder(
    struct Node* node,
    vector& preorder)
{
    if (node == NULL)
        return;
    // First print data of node
    preorder.push_back(node->data);
    // then recur on left subtree
    Preorder(node->left, preorder);
    // now recur on right subtree
    Preorder(node->right, preorder);
}
// Function to print the any array
void PrintArray(vector median)
{
    for (int i = 0;
         i         cout <    return;
}
// Function to create and print
// the Median array
void MedianArray(struct Node* node)
{
    // Vector to store
    // the median values
    vector median;
    if (node == NULL)
        return;
    vector preorder,
        postorder,
        inorder;
    // Traverse the tree
    Postorder(node, postorder);
    Inorder(node, inorder);
    Preorder(node, preorder);
    int n = preorder.size();
    for (int i = 0; i         // Temporary vector to sort
        // the three values
        vector temp;
        // Insert the values at ith index
        // for each traversal into temp
        temp.push_back(postorder[i]);
        temp.push_back(inorder[i]);
        temp.push_back(preorder[i]);
        // Sort the temp vector to
        // find the median
        sort(temp.begin(), temp.end());
        // Insert the middle value in
        // temp into the median vector
        median.push_back(temp[1]);
    }
    PrintArray(median);
    return;
}
// Driver Code
int main()
{
    struct Node* root = new Node(1);
    root->left = new Node(2);
    root->right = new Node(3);
    root->left->left = new Node(4);
    root->left->right = new Node(5);
    MedianArray(root);
    return 0;
}

Java 语言(一种计算机语言,尤用于创建网站)

// Java program to Obtain the median
// array for the preorder, postorder
// and inorder traversal of a binary tree
import java.io.*;
import java.util.*;
// A binary tree node has data,
// a pointer to the left child
// and a pointer to the right child
class Node
{
  int data;
  Node left,right;
  Node(int item)
  {
    data = item;
    left = right = null;
  }
}
class Tree {
  public static Vector postorder = new Vector();
  public static Vector inorder = new Vector();
  public static Vector preorder = new Vector();
  public static Node root;
  // Postorder traversal
  public static void Postorder(Node node)
  {
    if(node == null)
    {
      return;
    }
    // First recur on left subtree
    Postorder(node.left);
    // then recur on right subtree
    Postorder(node.right);
    // now deal with the node
    postorder.add(node.data);
  }
  // Inorder traversal
  public static void Inorder(Node node)
  {
    if(node == null)
    {
      return;
    }
    // First recur on left child
    Inorder(node.left);
    // then print the data of node
    inorder.add(node.data);
    // now recur on right child
    Inorder(node.right);      
  }
  // Preorder traversal
  public static void Preorder(Node node)
  {
    if(node == null)
    {
      return;
    }
    // First print data of node
    preorder.add(node.data);
    // then recur on left subtree
    Preorder(node.left);
    // now recur on right subtree
    Preorder(node.right);
  }
  // Function to print the any array    
  public static void PrintArray(Vector median)
  {
    for(int i = 0; i     {
      System.out.print(median.get(i) + " ");
    }
  }
  // Function to create and print
  // the Median array
  public static void MedianArray(Node node)
  {
    // Vector to store
    // the median values
    Vector median = new Vector();
    if(node == null)
    {
      return;
    }
    // Traverse the tree
    Postorder(node);
    Inorder(node);
    Preorder(node);
    int n = preorder.size();
    for(int i = 0; i     {
      // Temporary vector to sort
      // the three values
      Vector temp = new Vector();
      // Insert the values at ith index
      // for each traversal into temp
      temp.add(postorder.get(i));
      temp.add(inorder.get(i));
      temp.add(preorder.get(i));
      // Sort the temp vector to
      // find the median
      Collections.sort(temp);
      // Insert the middle value in
      // temp into the median vector
      median.add(temp.get(1));
    }
    PrintArray(median);
  }
  // Driver Code
  public static void main (String[] args)
  {
    Tree.root = new Node(1);
    Tree.root.left = new Node(2);
    Tree.root.right = new Node(3);
    Tree.root.left.left = new Node(4);
    Tree.root.left.right = new Node(5);
    MedianArray(root);
  }
}
// This code is contributed by avanitrachhadiya2155

Python 3

# Python3 program to Obtain the median
# array for the preorder, postorder
# and inorder traversal of a binary tree
# A binary tree node has data,
# a pointer to the left child
# and a pointer to the right child
class Node:
    def __init__(self, x):
        self.data = x
        self.left = None
        self.right = None
# Postorder traversal
def Postorder(node):
    global preorder
    if (node == None):
        return
    # First recur on left subtree
    Postorder(node.left)
    # then recur on right subtree
    Postorder(node.right)
    # now deal with the node
    postorder.append(node.data)
# Inorder traversal
def Inorder(node):
    global inorder
    if (node == None):
        return
    # First recur on left child
    Inorder(node.left)
    # then print the data of node
    inorder.append(node.data)
    # now recur on right child
    Inorder(node.right)
# Preorder traversal
def Preorder(node):
    global preorder
    if (node == None):
        return
    # First print data of node
    preorder.append(node.data)
    # then recur on left subtree
    Preorder(node.left)
    # now recur on right subtree
    Preorder(node.right)
# Function to print the any array
def PrintArray(median):
    for i in range(len(median)):
        print(median[i], end = " ")
    return
# Function to create and print
# the Median array
def MedianArray(node):
    global inorder, postorder, preorder
    # Vector to store
    # the median values
    median = []
    if (node == None):
        return
    # Traverse the tree
    Postorder(node)
    Inorder(node)
    Preorder(node)
    n = len(preorder)
    for i in range(n):
        # Temporary vector to sort
        # the three values
        temp = []
        # Insert the values at ith index
        # for each traversal into temp
        temp.append(postorder[i])
        temp.append(inorder[i])
        temp.append(preorder[i])
        # Sort the temp vector to
        # find the median
        temp = sorted(temp)
        # Insert the middle value in
        # temp into the median vector
        median.append(temp[1])
    PrintArray(median)
# Driver Code
if __name__ == '__main__':
    preorder, inorder, postorder = [], [], []
    root = Node(1)
    root.left = Node(2)
    root.right = Node(3)
    root.left.left = Node(4)
    root.left.right = Node(5)
    MedianArray(root)
# This code is contributed by mohit kumar 29

C

// C# program to Obtain the median
// array for the preorder, postorder
// and inorder traversal of a binary tree
using System;
using System.Collections.Generic;
using System.Numerics;
// A binary tree node has data,
// a pointer to the left child
// and a pointer to the right child
public class Node
{
  public int data;
  public Node left,right;
  public Node(int item)
  {
    data = item;
    left = right = null;
  }
}
public class Tree{
  static List postorder = new List();
  static List inorder = new List();
  static List preorder = new List();
  static Node root;
  // Postorder traversal
  public static void Postorder(Node node)
  {
    if(node == null)
    {
      return;
    }
    // First recur on left subtree
    Postorder(node.left);
    // then recur on right subtree
    Postorder(node.right);
    // now deal with the node
    postorder.Add(node.data);
  }
  // Inorder traversal
  public static void Inorder(Node node)
  {
    if(node == null)
    {
      return;
    }
    // First recur on left child
    Inorder(node.left);
    // then print the data of node
    inorder.Add(node.data);
    // now recur on right child
    Inorder(node.right);      
  }
  // Preorder traversal
  public static void Preorder(Node node)
  {
    if(node == null)
    {
      return;
    }
    // First print data of node
    preorder.Add(node.data);
    // then recur on left subtree
    Preorder(node.left);
    // now recur on right subtree
    Preorder(node.right);
  }
  // Function to print the any array    
  public static void PrintArray(List median)
  {
    for(int i = 0; i     {
      Console.Write(median[i] + " ");
    }
  }
  // Function to create and print
  // the Median array
  public static void MedianArray(Node node)
  {
    // Vector to store
    // the median values
    List median = new List();
    if(node == null)
    {
      return;
    }
    // Traverse the tree
    Postorder(node);
    Inorder(node);
    Preorder(node);
    int n = preorder.Count;
    for(int i = 0; i     {
      // Temporary vector to sort
      // the three values
      List temp = new List();
      // Insert the values at ith index
      // for each traversal into temp
      temp.Add(postorder[i]);
      temp.Add(inorder[i]);
      temp.Add(preorder[i]);
      // Sort the temp vector to
      // find the median
      temp.Sort();
      // Insert the middle value in
      // temp into the median vector
      median.Add(temp[1]);
    }
    PrintArray(median);
  }
  // Driver code
  static public void Main ()
  {
    Tree.root = new Node(1);
    Tree.root.left = new Node(2);
    Tree.root.right = new Node(3);
    Tree.root.left.left = new Node(4);
    Tree.root.left.right = new Node(5);
    MedianArray(root);
  }
}
// This code is contributed by rag2127

java 描述语言


Output: 

4 2 4 3 3

时间复杂度:O(N)T4】


推荐阅读
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • HashMap的相关问题及其底层数据结构和操作流程
    本文介绍了关于HashMap的相关问题,包括其底层数据结构、JDK1.7和JDK1.8的差异、红黑树的使用、扩容和树化的条件、退化为链表的情况、索引的计算方法、hashcode和hash()方法的作用、数组容量的选择、Put方法的流程以及并发问题下的操作。文章还提到了扩容死链和数据错乱的问题,并探讨了key的设计要求。对于对Java面试中的HashMap问题感兴趣的读者,本文将为您提供一些有用的技术和经验。 ... [详细]
  • 文章目录题目:二叉搜索树中的两个节点被错误地交换。基本思想1:中序遍历题目:二叉搜索树中的两个节点被错误地交换。请在不改变其结构的情况下 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • Android工程师面试准备及设计模式使用场景
    本文介绍了Android工程师面试准备的经验,包括面试流程和重点准备内容。同时,还介绍了建造者模式的使用场景,以及在Android开发中的具体应用。 ... [详细]
  • 本文由编程笔记#小编整理,主要介绍了关于数论相关的知识,包括数论的算法和百度百科的链接。文章还介绍了欧几里得算法、辗转相除法、gcd、lcm和扩展欧几里得算法的使用方法。此外,文章还提到了数论在求解不定方程、模线性方程和乘法逆元方面的应用。摘要长度:184字。 ... [详细]
  • 重入锁(ReentrantLock)学习及实现原理
    本文介绍了重入锁(ReentrantLock)的学习及实现原理。在学习synchronized的基础上,重入锁提供了更多的灵活性和功能。文章详细介绍了重入锁的特性、使用方法和实现原理,并提供了类图和测试代码供读者参考。重入锁支持重入和公平与非公平两种实现方式,通过对比和分析,读者可以更好地理解和应用重入锁。 ... [详细]
  • 本文介绍了使用哈夫曼树实现文件压缩和解压的方法。首先对数据结构课程设计中的代码进行了分析,包括使用时间调用、常量定义和统计文件中各个字符时相关的结构体。然后讨论了哈夫曼树的实现原理和算法。最后介绍了文件压缩和解压的具体步骤,包括字符统计、构建哈夫曼树、生成编码表、编码和解码过程。通过实例演示了文件压缩和解压的效果。本文的内容对于理解哈夫曼树的实现原理和应用具有一定的参考价值。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • 1Lock与ReadWriteLock1.1LockpublicinterfaceLock{voidlock();voidlockInterruptibl ... [详细]
author-avatar
啵__啵_891
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有