【遍历二叉树】06二叉树曲折(Z字形)层次遍历II【Binary Tree Zigzag Level Order Traversal】
2014-04-08 16:44
525 查看
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++给定一个二叉树,返回他的Z字形层次遍历的节点的values。(提示,从左到右,然后下一层从右到左,然后再变化方向,就是这样一层一层的遍历)例如:给定一个二叉树
返回的层次遍历的结果是:
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to right, then right to left for the next level and alternate between).For example:
Given binary tree
return its zigzag level order traversal as:
BinaryTree.h:
BinaryTree.cpp:
{3,9,20,#,#,15,7},
3 / \ 9 20 / \ 15 7
返回的层次遍历的结果是:
[ [3], [20,9], [15,7] ]
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to right, then right to left for the next level and alternate between).For example:
Given binary tree
{3,9,20,#,#,15,7},
3 / \ 9 20 / \ 15 7
return its zigzag level order traversal as:
[ [3], [20,9], [15,7] ]
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
test.cpp:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 | #include <iostream> #include <cstdio> #include <stack> #include <vector> #include "BinaryTree.h"using namespace std;/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ vector<vector<int> > zigzagLevelOrder(TreeNode *root) { vector<vector<int> > matrix; if(root == NULL) { return matrix; }vector<int> temp; temp.push_back(root->val); matrix.push_back(temp);vector<TreeNode *> path; path.push_back(root);int count = 1; /*拨动开关-因为第二次是从右边到左边*/ bool lefttoright = false;while(!path.empty()) { TreeNode *tp = path.front(); if(tp->left != NULL) { path.push_back(tp->left); } if(tp->right != NULL) { path.push_back(tp->right); }path.erase(path.begin()); count--;if(count == 0 && path.size()) { vector<int> tmp; tmp.clear(); if(lefttoright) { /*从左到右*/ vector<TreeNode *>::iterator it = path.begin(); for(; it != path.end(); ++it) { tmp.push_back( (*it)->val ); } lefttoright = false; } else { /*从右到左-下面这段代码VS运行错误不知道为什么*/ //vector<TreeNode *>::iterator it = path.end(); //for(--it; it >= path.begin(); --it) //{ // tmp.push_back( (*it)->val ); //} for (int i = path.size() - 1; i >= 0; --i) { tmp.push_back( path[i]->val ); }lefttoright = true; } matrix.push_back(tmp); count = path.size(); } } return matrix; }// 树中结点含有分叉, // 8 // / \ // 6 1 // / \ // 9 2 // / \ // 4 7 int main() { TreeNode *pNodeA1 = CreateBinaryTreeNode(8); TreeNode *pNodeA2 = CreateBinaryTreeNode(6); TreeNode *pNodeA3 = CreateBinaryTreeNode(1); TreeNode *pNodeA4 = CreateBinaryTreeNode(9); TreeNode *pNodeA5 = CreateBinaryTreeNode(2); TreeNode *pNodeA6 = CreateBinaryTreeNode(4); TreeNode *pNodeA7 = CreateBinaryTreeNode(7);ConnectTreeNodes(pNodeA1, pNodeA2, pNodeA3); ConnectTreeNodes(pNodeA2, pNodeA4, pNodeA5); ConnectTreeNodes(pNodeA5, pNodeA6, pNodeA7);PrintTree(pNodeA1);vector<vector<int> > ans = zigzagLevelOrder(pNodeA1);for (int i = 0; i < ans.size(); ++i) { for (int j = 0; j < ans[i].size(); ++j) { cout << ans[i][j] << " "; } cout << endl; }DestroyTree(pNodeA1); return 0; } |
输出结果:
题目ac了,但是测试用例没有通过
BinaryTree.h:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | #ifndef _BINARY_TREE_H_ #define _BINARY_TREE_H_struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) {} };TreeNode *CreateBinaryTreeNode(int value); void ConnectTreeNodes(TreeNode *pParent, TreeNode *pLeft, TreeNode *pRight); void PrintTreeNode(TreeNode *pNode); void PrintTree(TreeNode *pRoot); void DestroyTree(TreeNode *pRoot);#endif /*_BINARY_TREE_H_*/ |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 | #include <iostream> #include <cstdio> #include "BinaryTree.h"using namespace std;/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; *///创建结点 TreeNode *CreateBinaryTreeNode(int value) { TreeNode *pNode = new TreeNode(value);return pNode; }//连接结点 void ConnectTreeNodes(TreeNode *pParent, TreeNode *pLeft, TreeNode *pRight) { if(pParent != NULL) { pParent->left = pLeft; pParent->right = pRight; } }//打印节点内容以及左右子结点内容 void PrintTreeNode(TreeNode *pNode) { if(pNode != NULL) { printf("value of this node is: %d\n", pNode->val);if(pNode->left != NULL) printf("value of its left child is: %d.\n", pNode->left->val); else printf("left child is null.\n");if(pNode->right != NULL) printf("value of its right child is: %d.\n", pNode->right->val); else printf("right child is null.\n"); } else { printf("this node is null.\n"); }printf("\n"); }//前序遍历递归方法打印结点内容 void PrintTree(TreeNode *pRoot) { PrintTreeNode(pRoot);if(pRoot != NULL) { if(pRoot->left != NULL) PrintTree(pRoot->left);if(pRoot->right != NULL) PrintTree(pRoot->right); } }void DestroyTree(TreeNode *pRoot) { if(pRoot != NULL) { TreeNode *pLeft = pRoot->left; TreeNode *pRight = pRoot->right;delete pRoot; pRoot = NULL;DestroyTree(pLeft); DestroyTree(pRight); } } |
相关文章推荐
- Binary Tree Zigzag Level Order Traversal,z字形遍历二叉树,得到每层访问的节点值。
- 【LeetCode笔记】Binary Tree Zigzag Level Order Traversal 二叉树Z字形遍历
- LeetCode-Binary Tree Zigzag Level Order Traversal-二叉树锯齿层次遍历-二叉树DFS层次遍历
- Leetcode 107 Binary Tree Level Order Traversal II 二叉树层次遍历与倒转
- Binary Tree Level Order Traversal I和II 层次遍历二叉树
- LeetCode: 107_Binary Tree Level Order Traversal II | 二叉树自底向上的层次遍历 | Easy
- Binary Tree Zigzag Level Order Traversal 之字形遍历二叉树
- LeetCode: 103_Binary Tree Zigzag Level Order Traversal | 二叉树Zigzag层次遍历 | Medium
- [Lintcode]Binary Tree Level Order Traversal II 二叉树的层次遍历 II
- 【LeetCode】BinaryTreeLevelOrderTraversal_ii 二叉树的层次遍历 II
- LeetCode OJ 之 Binary Tree Level Order Traversal II (二叉树的层次遍历-二)
- LeetCode(Binary Tree Level Order Traversal, 2,Zigzag)二叉树的层次遍历
- 【LeetCode-面试算法经典-Java实现】【103-Binary Tree Zigzag Level Order Traversal(二叉树分层Z字形遍历)】
- 【遍历二叉树】05二叉树的层次遍历II【Binary Tree Level Order Traversal II】
- leetCode解题报告之Binary Tree Level Order Traversal II,I(二叉树层次遍历)
- Binary Tree Zigzag Level Order Traversal (二叉树锯齿形层次遍历)
- 103.leetcode Binary Tree Zigzag Level Order Traversal(medium)[二叉树层次遍历 栈]
- 【LeetCode】Binary Tree Zigzag Level Order Traversal 二叉树的锯齿形层次遍历 - Medium(LinkedIn)
- LeetCode: 102_Binary Tree Level Order Traversal | 二叉树自顶向下的层次遍历 | Easy
- Binary Tree Level Order Traversal 二叉树层次遍历