สมมติว่าเรามีรากต้นไม้ไบนารี เส้นทางซิกแซกสำหรับต้นไม้ไบนารีถูกกำหนดดังนี้ -
-
เลือกโหนดใดก็ได้ในไบนารีทรีและทิศทาง (ขวาหรือซ้าย)
-
หากทิศทางปัจจุบันอยู่ทางขวา ให้เคลื่อนที่ไปทางชายด์ด้านขวาของโหนดปัจจุบัน ไม่เช่นนั้นให้เคลื่อนไปทางชายด์ด้านซ้าย
-
แล้วเปลี่ยนทิศทางจากขวาไปซ้ายหรือกลับกัน
-
ทำซ้ำขั้นตอนที่ 2 และ 3 จนกว่าเราจะเคลื่อนเข้าไปในต้นไม้ไม่ได้
ในที่นี้ ความยาวซิกแซกถูกกำหนดเป็นจำนวนโหนดที่เข้าชม - 1 (โหนดเดียวมีความยาว 0) เราต้องหาเส้นทางซิกแซกที่ยาวที่สุดในต้นไม้นั้น ตัวอย่างเช่น ถ้าต้นไม้มีลักษณะ −
ผลลัพธ์จะเป็น 3 เช่น (ขวา ซ้าย ขวา)
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดวิธีการที่เรียกว่า dfs() ซึ่งจะทำการรูทและซ้ายB
-
ถ้ารูทเป็นโมฆะ ให้คืนค่า -1
-
ถ้ารูทมีเพียงหนึ่งโหนดในทรี ให้คืนค่า 0
-
leftV :=dfs(ซ้ายของรูท, จริง) และ rightV :=dfs(ทางขวาของรูท, เท็จ)
-
ret :=สูงสุดของ ret และ (1 + สูงสุดของ leftV และ rightV)
-
ถ้า leftB ไม่ใช่ 0 ให้คืนค่า 1 + rightV ไม่เช่นนั้นให้คืนค่า 1 + leftV
-
จากวิธีหลัก ตั้งค่า ret :=0
-
เรียก dfs(root, true) และเรียก dfs(root, false)
-
รีเทิร์น
ตัวอย่าง (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