Зеркальное изображение бинарного дерева - PullRequest
11 голосов
/ 06 декабря 2010

Предположим, есть дерево:

             1
            / \
           2   3
              / \
             4   5

Тогда зеркальное отображение будет:

              1
             / \
            3   2
           / \
          5   4

Предположим, что узлы имеют следующую структуру:

struct node{
      node left;
      node right;
      int value;
}

Может кто-нибудь предложить алгоритм для этого?

Ответы [ 13 ]

35 голосов
/ 06 декабря 2010

Звучит как домашнее задание.

Это выглядит очень просто.Напишите рекурсивную подпрограмму, которая сначала в глубину посещает каждый узел и строит зеркальное дерево с обращенными влево и вправо.

struct node *mirror(struct node *here) {

  if (here == NULL)
     return NULL;
  else {

    struct node *newNode = malloc (sizeof(struct node));

    newNode->value = here->value;
    newNode->left = mirror(here->right);
    newNode->right = mirror(here->left);

    return newNode;
  }
}

Это возвращает новое дерево - некоторые другие ответы делают это на месте.Зависит от того, что твое задание попросило тебя сделать :)

26 голосов
/ 06 декабря 2010
void swap_node(node n) {
  if(n != null) {
    node tmp = n.left;
    n.left = n.right;
    n.right = tmp;

    swap_node(n.left);
    swap_node(n.right);
  }
}

swap_node(root);
10 голосов
/ 06 декабря 2010

Банальный раствор:

for each node in tree
    exchange leftchild with rightchild.
5 голосов
/ 13 апреля 2014

Рекурсивные и итерационные методы в JAVA: 1) Рекурсивные:

    public static TreeNode mirrorBinaryTree(TreeNode root){

    if(root == null || (root.left == null && root.right == null))
        return root;

    TreeNode temp = root.left;
    root.left = root.right;
    root.right = temp;

    mirrorBinaryTree(root.left);
    mirrorBinaryTree(root.right);


    return root;

}

2) Итерационные:

public static TreeNode mirrorBinaryTreeIterative(TreeNode root){
    if(root == null || (root.left == null && root.right == null))
        return root;

    TreeNode parent = root;
    Stack<TreeNode> treeStack = new Stack<TreeNode>();
    treeStack.push(root);

    while(!treeStack.empty()){
        parent = treeStack.pop();

        TreeNode temp = parent.right;
        parent.right = parent.left;
        parent.left = temp;

        if(parent.right != null)
            treeStack.push(parent.right);
        if(parent.left != null)
            treeStack.push(parent.left);
    }
    return root;
}
3 голосов
/ 24 февраля 2013

Итеративное решение:

public void mirrorIterative() {
    Queue<TreeNode> nodeQ = new LinkedList<TreeNode>();
    nodeQ.add(root);
    while(!nodeQ.isEmpty()) {
        TreeNode node = nodeQ.remove();
        if(node.leftChild == null && node.rightChild == null)
            continue;
        if(node.leftChild != null && node.rightChild != null) {
            TreeNode temp = node.leftChild;
            node.leftChild = node.rightChild;
            node.rightChild = temp;
            nodeQ.add(node.leftChild);
            nodeQ.add(node.rightChild);
        }
        else if(node.leftChild == null) {
            node.leftChild = node.rightChild;
            node.rightChild = null;
            nodeQ.add(node.leftChild);
        } else {
            node.rightChild = node.leftChild;
            node.leftChild = null;
            nodeQ.add(node.rightChild);
        }
    }
}
3 голосов
/ 28 апреля 2011
void mirror(struct node* node)  
{
   if (node==NULL)
   {
      return;
   }
   else 
   {
      struct node* temp;
      mirror(node->left);
      mirror(node->right);
      temp = node->left;
      node->left = node->right;
      node->right = temp;
    }
}
2 голосов
/ 21 мая 2012
void mirror(node<t> *& root2,node<t> * root)
{
    if(root==NULL)
    {
        root2=NULL;
    }
    else {
        root2=new node<t>;
        root2->data=root->data;
        root2->left=NULL;
        root2->right=NULL;
        mirror(root2->left,root->right);
        mirror(root2->right,root->left);
    }
}
1 голос
/ 22 июля 2012
TreeNode * mirror(TreeNode *node){
  if(node==NULL){
    return NULL;
  }else{
    TreeNode *temp=node->left;
    node->left=mirror(node->right);
    node->right=mirror(temp);
    return node;
  }
}
0 голосов
/ 31 января 2019

Вот нерекурсивный способ сделать это в python, используя очереди. Класс Queue может быть инициализирован так:

class Queue(object):
    def __init__(self):
        self.items = []

    def enqueue(self, item):
        self.items.insert(0, item)

    def dequeue(self):
        if not self.is_empty():
            return self.items.pop()

    def is_empty(self):
        return len(self.items) == 0

    def peek(self):
        if not self.is_empty():
            return self.items[-1]

    def __len__(self):
        return self.size()

    def size(self):
        return len(self.items)

Класс, представляющий узел:

class Node:
    def __init__(self, data):
        self.left = None
        self.right = None
        self.val = data

А вот метод, который выполняет основную задачу:

def mirror_tree_iterative(root):
    if root is None:
        return

    q = Queue()
    q.enqueue(root)

    while(not q.is_empty()):
        curr = q.peek()
        q.dequeue()
        curr.left, curr.right = curr.right, curr.left
        if curr.left:
            q.enqueue(curr.left)
        if curr.right:
            q.enqueue(curr.right)
0 голосов
/ 23 июня 2017

Что ж, на этот вопрос есть много ответов. Я публикую итерационную версию для этого, которая довольно проста для понимания. Используется обход уровня порядка.

//Function for creating Binary Tree
//Assuming *root for original tree and *root2 for mirror tree
//are declared globally
void insert(int data)
{
struct treenode* temp;
if(root2 == NULL)
{
root2 = createNode(data);
return;
}
else{
queue<treenode*> q;
q.push(root2);
while(!q.empty())
{
 temp = q.front();
 q.pop();
 if(temp->left)
 q.push(temp->left);
 else{
 temp->left = createNode(data);
 return;
}
if(temp->right)
{
q.push(temp->right);
}
else{
temp -> right = createNode(data);
return;
}
}
}
}
//Iterative version for Mirror of a Binary Tree 
void mirrorBinaryTree()
{
struct treenode *front;
queue<treenode*> q;
q.push(root);
while(!q.empty())
{
 front = q.front();
 insert(front->data);
 q.pop();
 if(front->right)
 q.push(front->right);
 if(front->left)
 q.push(front->left);
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...