Java, c++ 中序和前序 或 中序和后序构建二叉树
2017-07-31 10:10
706 查看
利用递归,构建二叉树的时候主要就是要搞清楚,前序和中序,后序与中序的关系,然后要递归地往下构建,先建当前节点的左孩子,再右孩子,然后我利用另外一种序列遍历来验证 构建的二叉树是否正确。
Java 先序和中序为例:
#include <iostream> #include <cstdio> using namespace std; const int maxn = 35; int in[maxn]; int pre[maxn]; struct node { int data; node *lchild; node *rchild; }; //inOrder和preOrder创建 树 /* inOrder: 12 11 20 17 1 15 8 5 preOrder: 1 11 12 17 20 5 8 15 */ // or // //use the inOrder and preOrder create the binary tree node *Create(int preL, int preR, int inL,int inR) { if ( preL > preR ) return NULL; node *root = new node(); root->data = pre[preL]; int index; for ( index = inL; index <= inR; index++ ) { if ( in[index] == pre[preL] )break; } int numLeft = index - inL; root->lchild = Create(preL+1, preL+numLeft, inL, index-1); root->rchild = Create(preL+numLeft+1, preR, index+1, inR); return root; } void PostOrderTraversal(node *root) { if ( root != NULL ) { PostOrderTraversal(root->lchild); PostOrderTraversal(root->rchild); cout << root->data << " "; } } int main() { int n; cin >> n; for ( int i = 0 ; i < n; i++ ) { cin >> in[i]; } for ( int i = 0; i < n; i++ ) { cin >> pre[i]; } node *root; root = Create(0,n-1,0,n-1); PostOrderTraversal(root); return 0; } #include <iostream> #include <cstdio> using namespace std; const int maxn = 35; int in[maxn]; int post[maxn]; struct node { int data; node *lchild; node *rchild; }; //inOrder和postOrder 创建 树 /* inOrder:12 11 20 17 1 15 8 5 postOrder:12 20 17 11 15 8 5 1 */ // use the inOrder and postOrder create the binary tree // node *Create(int postL, int postR, int inL, int inR) { if ( postL > postR ) return NULL; node *root = new node(); root->data = post[postR]; int index; for ( index = inL; index <= inR; index++ ) { if ( in[index] == post[postR] )break; } int numLeft = index - inL; root->lchild = Create(postL, postL+numLeft-1, inL, index-1); root->rchild = Create(postL+numLeft, postR-1, index+1, inR); return root; } void PreOrderTraversal(node *root) { if ( root != NULL ) { cout << root->data << " "; PreOrderTraversal(root->lchild); PreOrderTraversal(root->rchild); } } int main() { int n; cin >> n; for ( int i = 0 ; i < n; i++ ) { cin >> in[i]; } for ( int i = 0; i < n; i++ ) { cin >> post[i]; } node *root; root = Create(0,n-1,0,n-1); PreOrderTraversal(root); return 0; }
Java 先序和中序为例:
public class Solution { public static TreeNode reConstructBinaryTree(int [] pre,int [] in) { int in_size = in.length; if (in_size == 0) return null; int val = pre[0]; TreeNode treeNode = new TreeNode(val); int i; for (i = 0; i < in_size; i++) { if (in[i] == val) break; } int[] pre_left = new int[i]; int[] in_left = new int[i]; int[] pre_right = new int[in_size-i-1]; int[] in_right = new int[in_size-i-1]; //left tree if (i > 0) { for (int j = 0; j < i; j++) { pre_left[j] = pre[j+1]; in_left[j] = in[j]; } treeNode.left = reConstructBinaryTree(pre_left, in_left); } else { treeNode.left = null; } //right tree if (in_size-i-1 > 0) { for (int j = i+1; j < in_size; j++) { pre_right[j-i-1] = pre[j]; in_right[j-i-1] = in[j]; } treeNode.right = reConstructBinaryTree(pre_right, in_right); } else { treeNode.right = null; } return treeNode; } public static class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } public static void PostTraversal(TreeNode treeNode) { if (treeNode != null){ PostTraversal(treeNode.left); PostTraversal(treeNode.right); System.out.print(treeNode.val+" "); } } static int[] pre = {1, 2, 4, 7, 3, 5, 6, 8}; static int[] in = {4, 7, 2, 1, 5, 3, 8, 6}; public static TreeNode BuildTree(int PreL, int PreR, int inL, int inR) { if (PreL > PreR) return null; int val = pre[PreL]; TreeNode treeNode = new TreeNode(val); int i; for (i = inL; i <= inR; i++) { if (in[i] == val) break; } int numleft = i - inL; treeNode.left = BuildTree(PreL+1, PreL+numleft, inL, i-1); treeNode.right = BuildTree(PreL+numleft+1, PreR, i+1, inR); return treeNode; } public static void main(String[] args) { TreeNode treeNode1 = reConstructBinaryTree(pre, in); PostTraversal(treeNode1); int len = pre.length; System.out.println(); TreeNode treeNode2 = BuildTree(0, len-1, 0, len-1); PostTraversal(treeNode2); } }
相关文章推荐
- Java实现二叉树的递归构建及先序、中序、后序、层序遍历(递归和循环)
- java 二叉树的构建 先序、中序、后序遍历
- java 实现二叉树的构建,先序,中序,后序,层次,递归,非递归的遍历
- Java迭代实现二叉树的前序、中序、后序遍历
- 探讨:C++实现链式二叉树(用非递归方式先序,中序,后序遍历二叉树)
- 二叉树的非递归前序,中序,后序遍历的Java实现
- Java二叉树(三)--非递归的中序_先序_后序遍历二叉树
- 二叉树的前序,中序,后序和层序遍历java实现
- Java二叉树(一)--定义及前序、中序、后序、层次遍历及求高度的实现
- 二叉树先序构建+(先序,中序,后序遍历)
- C++编写数据结构中的二叉树(前序,中序,后序遍历)
- 中序和后序构建二叉树
- 二叉树的前序、中序、后序(递归、非递归)遍历java实现
- 二叉树的重建--已知中序和前序或中序和后序逆向构建二叉树
- 二叉树的遍历问题-----Java实现(中序、前序、后序、遍历)
- 二叉树的建树、遍历(先序、中序、后序、层次)(递归和非递归)--Java实现
- 根据前序遍历和中序遍历构建二叉树以及根据中序遍历后序遍历构建二叉树
- JAVA实现二叉树的遍历的非递归算法及递归算法(前序,中序,后序,层次)
- 二叉树的先序、中序、后序和中序遍历——Java实现
- LeetCode-106:Construct Binary Tree from Inorder and Postorder Traversal (利用中序和后序遍历构建二叉树) -- medium