C++ 中二叉树的最长之字形路径
假设我们有一个二叉树根节点,二叉树的之字形路径定义如下:
在二叉树中选择任意一个节点和一个方向(向右或向左)。
如果当前方向是向右,则向当前节点的右子节点移动,否则向左子节点移动。
然后将方向从右更改为左,反之亦然。
重复第二步和第三步,直到我们无法在树中移动。
这里的之字形长度定义为访问的节点数减 1。(单个节点的长度为 0)。我们必须找到该树中包含的最长之字形路径。例如,如果树如下所示:
输出将为 3,因为 (右,左,右)
为了解决这个问题,我们将遵循以下步骤:
定义一个名为 dfs() 的方法,它将接收根节点和 leftB 作为参数
如果根节点为空,则返回 -1
如果根节点是树中唯一的节点,则返回 0
leftV := dfs(根节点的左子节点, true) 以及 rightV := dfs(根节点的右子节点, false)
ret := ret 和 (1 + leftV 和 rightV 的最大值) 的最大值
如果 leftB 不为 0,则返回 1 + rightV,否则返回 1 + leftV
在主方法中,设置 ret := 0
调用 dfs(根节点, true) 和 dfs(根节点, false)
返回 ret
示例(C++)
让我们看一下以下实现,以便更好地理解:
#include <bits/stdc++.h> using namespace std; class TreeNode{ public: int val; TreeNode *left, *right; TreeNode(int data){ val = data; left = right = NULL; } }; void insert(TreeNode **root, int val){ queue<TreeNode*> q; q.push(*root); while(q.size()){ TreeNode *temp = q.front(); q.pop(); if(!temp->left){ if(val != NULL) temp->left = new TreeNode(val); else temp->left = new TreeNode(0); return; } else { q.push(temp->left); } if(!temp->right){ if(val != NULL) temp->right = new TreeNode(val); else temp->right = new TreeNode(0); return; }else{ q.push(temp->right); } } } TreeNode *make_tree(vector<int> v){ TreeNode *root = new TreeNode(v[0]); for(int i = 1; i<v.size(); i++){ insert(&root, v[i]); } return root; } class Solution { public: int ret; int dfs(TreeNode* root, bool leftB){ if(!root) return -1; if(!root->left && !root->right) return 0; int leftV = dfs(root->left, true); int rightV = dfs(root->right, false); ret = max(ret, 1 + max(leftV, rightV)); if(leftB) return 1 + rightV; return 1 + leftV; } int longestZigZag(TreeNode* root) { ret = 0; dfs(root, true); dfs(root, false); return ret; } }; main(){ vector<int> v = {1,NULL,1,1,1,NULL,NULL,1,1,NULL,1,NULL,NULL,NULL,1,NULL,1}; TreeNode *root = make_tree(v); Solution ob; cout << (ob.longestZigZag(root)); }
输入
[1,null,1,1,1,null,null,1,1,null,1,null,null,null,1,null,1]
输出
3
广告