二叉树的无递归无堆栈后序遍历

先决条件—— 树的按序/前序/后序遍历 给定一棵二叉树,执行后序遍历。

null

我们在下面讨论了后序遍历的方法。 1) 递归后序遍历 . 2) 使用堆栈进行后序遍历。 2) 使用两个堆栈的后序遍历 . 在这种方法中 DFS 讨论了基于该方法的解决方案。我们在哈希表中跟踪访问的节点。

C++

// CPP program or postorder traversal
#include <bits/stdc++.h>
using namespace std;
/* A binary tree node has data, pointer to left child
and a pointer to right child */
struct Node {
int data;
struct Node *left, *right;
};
/* Helper function that allocates a new node with the
given data and NULL left and right pointers. */
void postorder( struct Node* head)
{
struct Node* temp = head;
unordered_set<Node*> visited;
while (temp && visited.find(temp) == visited.end()) {
// Visited left subtree
if (temp->left &&
visited.find(temp->left) == visited.end())
temp = temp->left;
// Visited right subtree
else if (temp->right &&
visited.find(temp->right) == visited.end())
temp = temp->right;
// Print node
else {
printf ( "%d " , temp->data);
visited.insert(temp);
temp = head;
}
}
}
struct Node* newNode( int data)
{
struct Node* node = new Node;
node->data = data;
node->left = NULL;
node->right = NULL;
return (node);
}
/* Driver program to test above functions*/
int main()
{
struct Node* root = newNode(8);
root->left = newNode(3);
root->right = newNode(10);
root->left->left = newNode(1);
root->left->right = newNode(6);
root->left->right->left = newNode(4);
root->left->right->right = newNode(7);
root->right->right = newNode(14);
root->right->right->left = newNode(13);
postorder(root);
return 0;
}


JAVA

// JAVA program or postorder traversal
import java.util.*;
/* A binary tree node has data, pointer to left child
and a pointer to right child */
class Node
{
int data;
Node left, right;
Node( int data)
{
this .data = data;
this .left = this .right = null ;
}
};
class GFG
{
Node root;
/* Helper function that allocates a new node with the
given data and null left and right pointers. */
void postorder(Node head)
{
Node temp = root;
HashSet<Node> visited = new HashSet<>();
while ((temp != null && !visited.contains(temp)))
{
// Visited left subtree
if (temp.left != null &&
!visited.contains(temp.left))
temp = temp.left;
// Visited right subtree
else if (temp.right != null &&
!visited.contains(temp.right))
temp = temp.right;
// Print node
else
{
System.out.printf( "%d " , temp.data);
visited.add(temp);
temp = head;
}
}
}
/* Driver program to test above functions*/
public static void main(String[] args)
{
GFG gfg = new GFG();
gfg.root = new Node( 8 );
gfg.root.left = new Node( 3 );
gfg.root.right = new Node( 10 );
gfg.root.left.left = new Node( 1 );
gfg.root.left.right = new Node( 6 );
gfg.root.left.right.left = new Node( 4 );
gfg.root.left.right.right = new Node( 7 );
gfg.root.right.right = new Node( 14 );
gfg.root.right.right.left = new Node( 13 );
gfg.postorder(gfg.root);
}
}
// This code is contributed by Rajput-Ji


python

# Python program or postorder traversal
''' A binary tree node has data, pointer to left child
and a pointer to right child '''
class newNode:
# Constructor to create a newNode
def __init__( self , data):
self .data = data
self .left = None
self .right = None
''' Helper function that allocates a new node with the
given data and NULL left and right pointers. '''
def postorder(head):
temp = head
visited = set ()
while (temp and temp not in visited):
# Visited left subtree
if (temp.left and temp.left not in visited):
temp = temp.left
# Visited right subtree
elif (temp.right and temp.right not in visited):
temp = temp.right
# Print node
else :
print (temp.data, end = " " )
visited.add(temp)
temp = head
''' Driver program to test above functions'''
if __name__ = = '__main__' :
root = newNode( 8 )
root.left = newNode( 3 )
root.right = newNode( 10 )
root.left.left = newNode( 1 )
root.left.right = newNode( 6 )
root.left.right.left = newNode( 4 )
root.left.right.right = newNode( 7 )
root.right.right = newNode( 14 )
root.right.right.left = newNode( 13 )
postorder(root)
# This code is contributed by
# SHUBHAMSINGH10


C#

// C# program or postorder traversal
using System;
using System.Collections.Generic;
/* A binary tree node has data, pointer to left child
and a pointer to right child */
public
class Node
{
public
int data;
public
Node left, right;
public
Node( int data)
{
this .data = data;
this .left = this .right = null ;
}
};
class GFG
{
Node root;
/* Helper function that allocates a new node with the
given data and null left and right pointers. */
void postorder(Node head)
{
Node temp = root;
HashSet<Node> visited = new HashSet<Node>();
while ((temp != null && !visited.Contains(temp)))
{
// Visited left subtree
if (temp.left != null &&
!visited.Contains(temp.left))
temp = temp.left;
// Visited right subtree
else if (temp.right != null &&
!visited.Contains(temp.right))
temp = temp.right;
// Print node
else
{
Console.Write(temp.data + " " );
visited.Add(temp);
temp = head;
}
}
}
/* Driver code*/
public static void Main(String[] args)
{
GFG gfg = new GFG();
gfg.root = new Node(8);
gfg.root.left = new Node(3);
gfg.root.right = new Node(10);
gfg.root.left.left = new Node(1);
gfg.root.left.right = new Node(6);
gfg.root.left.right.left = new Node(4);
gfg.root.left.right.right = new Node(7);
gfg.root.right.right = new Node(14);
gfg.root.right.right.left = new Node(13);
gfg.postorder(gfg.root);
}
}
// This code is contributed by Rajput-Ji


Javascript

<script>
// JavaScript program or postorder traversal
/* A binary tree node has data, pointer to left child
and a pointer to right child */
class Node
{
constructor(data)
{
this .data = data;
this .left = null ;
this .right = null ;
}
};
var root = null ;
/* Helper function that allocates a new node with the
given data and null left and right pointers. */
function postorder(head)
{
var temp = root;
var visited = new Set();
while ((temp != null && !visited.has(temp)))
{
// Visited left subtree
if (temp.left != null &&
!visited.has(temp.left))
temp = temp.left;
// Visited right subtree
else if (temp.right != null &&
!visited.has(temp.right))
temp = temp.right;
// Print node
else
{
document.write(temp.data + " " );
visited.add(temp);
temp = head;
}
}
}
/* Driver code*/
root = new Node(8);
root.left = new Node(3);
root.right = new Node(10);
root.left.left = new Node(1);
root.left.right = new Node(6);
root.left.right.left = new Node(4);
root.left.right.right = new Node(7);
root.right.right = new Node(14);
root.right.right.left = new Node(13);
postorder(root);
</script>


输出:

1 4 7 6 3 13 14 10 8 

替代解决方案: 我们可以在每个节点上保留访问标志,而不是单独的哈希表。

C++

// CPP program or postorder traversal
#include <bits/stdc++.h>
using namespace std;
/* A binary tree node has data, pointer to left child
and a pointer to right child */
struct Node {
int data;
struct Node *left, *right;
bool visited;
};
void postorder( struct Node* head)
{
struct Node* temp = head;
while (temp && temp->visited == false ) {
// Visited left subtree
if (temp->left && temp->left->visited == false )
temp = temp->left;
// Visited right subtree
else if (temp->right && temp->right->visited == false )
temp = temp->right;
// Print node
else {
printf ( "%d " , temp->data);
temp->visited = true ;
temp = head;
}
}
}
struct Node* newNode( int data)
{
struct Node* node = new Node;
node->data = data;
node->left = NULL;
node->right = NULL;
node->visited = false ;
return (node);
}
/* Driver program to test above functions*/
int main()
{
struct Node* root = newNode(8);
root->left = newNode(3);
root->right = newNode(10);
root->left->left = newNode(1);
root->left->right = newNode(6);
root->left->right->left = newNode(4);
root->left->right->right = newNode(7);
root->right->right = newNode(14);
root->right->right->left = newNode(13);
postorder(root);
return 0;
}


JAVA

// Java program or postorder traversal
class GFG
{
/* A binary tree node has data,
pointer to left child
and a pointer to right child */
static class Node
{
int data;
Node left, right;
boolean visited;
}
static void postorder( Node head)
{
Node temp = head;
while (temp != null &&
temp.visited == false )
{
// Visited left subtree
if (temp.left != null &&
temp.left.visited == false )
temp = temp.left;
// Visited right subtree
else if (temp.right != null &&
temp.right.visited == false )
temp = temp.right;
// Print node
else
{
System.out.printf( "%d " , temp.data);
temp.visited = true ;
temp = head;
}
}
}
static Node newNode( int data)
{
Node node = new Node();
node.data = data;
node.left = null ;
node.right = null ;
node.visited = false ;
return (node);
}
/* Driver code*/
public static void main(String []args)
{
Node root = newNode( 8 );
root.left = newNode( 3 );
root.right = newNode( 10 );
root.left.left = newNode( 1 );
root.left.right = newNode( 6 );
root.left.right.left = newNode( 4 );
root.left.right.right = newNode( 7 );
root.right.right = newNode( 14 );
root.right.right.left = newNode( 13 );
postorder(root);
}
}
// This code is contributed by Arnab Kundu


Python3

"""Python3 program or postorder traversal """
# A Binary Tree Node
# Utility function to create a
# new tree node
class newNode:
# Constructor to create a newNode
def __init__( self , data):
self .data = data
self .left = None
self .right = None
self .visited = False
def postorder(head) :
temp = head
while (temp and temp.visited = = False ):
# Visited left subtree
if (temp.left and
temp.left.visited = = False ):
temp = temp.left
# Visited right subtree
elif (temp.right and
temp.right.visited = = False ):
temp = temp.right
# Print node
else :
print (temp.data, end = " " )
temp.visited = True
temp = head
# Driver Code
if __name__ = = '__main__' :
root = newNode( 8 )
root.left = newNode( 3 )
root.right = newNode( 10 )
root.left.left = newNode( 1 )
root.left.right = newNode( 6 )
root.left.right.left = newNode( 4 )
root.left.right.right = newNode( 7 )
root.right.right = newNode( 14 )
root.right.right.left = newNode( 13 )
postorder(root)
# This code is contributed by
# SHUBHAMSINGH10


C#

// C# program or postorder traversal
using System;
class GFG
{
/* A binary tree node has data,
pointer to left child
and a pointer to right child */
class Node
{
public int data;
public Node left, right;
public bool visited;
}
static void postorder( Node head)
{
Node temp = head;
while (temp != null &&
temp.visited == false )
{
// Visited left subtree
if (temp.left != null &&
temp.left.visited == false )
temp = temp.left;
// Visited right subtree
else if (temp.right != null &&
temp.right.visited == false )
temp = temp.right;
// Print node
else
{
Console.Write( "{0} " , temp.data);
temp.visited = true ;
temp = head;
}
}
}
static Node newNode( int data)
{
Node node = new Node();
node.data = data;
node.left = null ;
node.right = null ;
node.visited = false ;
return (node);
}
/* Driver code*/
public static void Main(String []args)
{
Node root = newNode(8);
root.left = newNode(3);
root.right = newNode(10);
root.left.left = newNode(1);
root.left.right = newNode(6);
root.left.right.left = newNode(4);
root.left.right.right = newNode(7);
root.right.right = newNode(14);
root.right.right.left = newNode(13);
postorder(root);
}
}
// This code is contributed by 29AjayKumar


Javascript

<script>
// JavaScript program or postorder traversal
/* A binary tree node has data,
pointer to left child
and a pointer to right child */
class Node
{
constructor() {
this .data;
this .left;
this .right;
this .visited;
}
}
function postorder(head)
{
let temp = head;
while (temp != null &&
temp.visited == false )
{
// Visited left subtree
if (temp.left != null &&
temp.left.visited == false )
temp = temp.left;
// Visited right subtree
else if (temp.right != null &&
temp.right.visited == false )
temp = temp.right;
// Print node
else
{
document.write(temp.data + " " );
temp.visited = true ;
temp = head;
}
}
}
function newNode(data)
{
let node = new Node();
node.data = data;
node.left = null ;
node.right = null ;
node.visited = false ;
return (node);
}
let root = newNode(8);
root.left = newNode(3);
root.right = newNode(10);
root.left.left = newNode(1);
root.left.right = newNode(6);
root.left.right.left = newNode(4);
root.left.right.right = newNode(7);
root.right.right = newNode(14);
root.right.right.left = newNode(13);
postorder(root);
</script>


输出:

1 4 7 6 3 13 14 10 8 

上述解的时间复杂度为O(n) 2. )在最坏的情况下,我们在访问每个节点后将指针移回头部。 使用 无序地图 我们不需要将指针移回头部,所以时间复杂度为O(n)。

C++

// CPP program or postorder traversal
#include <bits/stdc++.h>
using namespace std;
/* A binary tree node has data, pointer to left child
and a pointer to right child */
struct Node {
int data;
struct Node *left, *right;
bool visited;
};
void postorder(Node* root)
{
Node* n = root;
unordered_map<Node*, Node*> parentMap;
parentMap.insert(pair<Node*, Node*>(root, nullptr));
while (n) {
if (n->left && parentMap.find(n->left) == parentMap.end()) {
parentMap.insert(pair<Node*, Node*>(n->left, n));
n = n->left;
}
else if (n->right && parentMap.find(n->right) == parentMap.end()) {
parentMap.insert(pair<Node*, Node*>(n->right, n));
n = n->right;
}
else {
cout << n->data << " " ;
n = (parentMap.find(n))->second;
}
}
}
struct Node* newNode( int data)
{
struct Node* node = new Node;
node->data = data;
node->left = NULL;
node->right = NULL;
node->visited = false ;
return (node);
}
/* Driver program to test above functions*/
int main()
{
struct Node* root = newNode(8);
root->left = newNode(3);
root->right = newNode(10);
root->left->left = newNode(1);
root->left->right = newNode(6);
root->left->right->left = newNode(4);
root->left->right->right = newNode(7);
root->right->right = newNode(14);
root->right->right->left = newNode(13);
postorder(root);
return 0;
}


输出:

1 4 7 6 3 13 14 10 8 

© 版权声明
THE END
喜欢就支持一下吧
点赞12 分享